Это возможно, но некрасиво. В частности, лексер всегда находится в согласованном состоянии, когда вы возвращаетесь в синтаксический анализатор (поскольку он возвращает токен), но он может быть не в том состоянии, которое вы ожидаете от синтаксического анализатора. возможно, сделал предварительный вызов.
В целом обратная связь между парсером и лексером довольно запутанная. Это, по крайней мере, частично, почему лексер gcc закодирован вручную, так как лексер должен возвращать "слово typedef" при анализе определения типа C и "имя переменной не-typedef" при разборе объявления переменной C, и это серьезно уродливо, поскольку :
typedef int X;
void f(void) {
X X;
на самом деле допустимый синтаксис, использующий имя typedef слева от X X
и имя переменной, не относящееся к typedef, справа. (Кое-что из этого могло измениться с тех пор, как я в последний раз был на низких уровнях gcc, что было в эпоху 2.x. :-))
Если вы можете справиться с этим каким-то другим способом, я бы порекомендовал это вместо этого.
person
torek
schedule
25.11.2013