Есть ли способ изменить стартовое состояние гибкого бизона? - PullRequest
2 голосов
/ 21 марта 2011

Я определил различные состояния в моем лексере, которые меняются не в зависимости от токена, а от последовательности токенов (аналогично тому, как работают шаблоны). Я могу определить более длинные токены, но мне как-то нравится этот подход лучше.

Ответы [ 2 ]

3 голосов
/ 21 марта 2011

Вы можете вставить функцию в третий раздел .l-файла, который использует макрос BEGIN, а затем вызвать эту функцию из действия вашего бизона (или в любом другом месте по этому вопросу).Вы должны быть осторожны с тем фактом, что зубр может прочитать впереди токен, прежде чем сокращать правило (запускать его действие), поэтому получить правильное состояние, установленное в нужный момент, может быть сложно.

0 голосов
/ 05 января 2012

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

Здесь обсуждается фактический метод, хотя может потребоваться адаптация к зубрам и / или sourceforge flex: http://my.opera.com/myrkraverk/blog/2012/01/04/passing-parameters-to-yacc-and-flex

...