Можно ли изменить статус гибкости с помощью действий грамматики бизона?

Я создаю реентерабельный синтаксический анализатор flex/bison на C и активно использую состояния внутри лексического лексера, в основном эксклюзивные.

Но я был бы признателен, если бы это было возможно, чтобы установить состояние лексера из действия середины правила bison. Есть ли возможность изменить состояние лексера во время выполнения от бизона, т.е. в середине правила бизона, через связанное с ним действие?


person overtherain    schedule 25.11.2013    source источник


Ответы (1)


Это возможно, но некрасиво. В частности, лексер всегда находится в согласованном состоянии, когда вы возвращаетесь в синтаксический анализатор (поскольку он возвращает токен), но он может быть не в том состоянии, которое вы ожидаете от синтаксического анализатора. возможно, сделал предварительный вызов.

В целом обратная связь между парсером и лексером довольно запутанная. Это, по крайней мере, частично, почему лексер 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
comment
Это не так уж плохо — синтаксический анализатор не более чем на 1 токен опережает лексер в базовом bison. Проблема с typedefs независима, так как вам нужно иметь возможность переопределять имена типов во внутренней области видимости, что просто означает, что ваша грамматика должна принимать имя typedef для декларатора в объявлении. Никакой специальной работы с лексером не требуется. - person Chris Dodd; 26.11.2013
comment
@ChrisDodd: Хорошо, может быть, я немного перепродал. :-) Я просто помню, как пошел по этому пути и отступил после того, как понял, что это означает, что ваш лексер становится зависимым от грамматики и от того, решил ли синтаксический анализатор уже извлечь следующий токен. (Что, да, вы можете понять, но это просто похоже на плохой дизайн.) - person torek; 26.11.2013