бизон / флекс: заглянуть на следующую букву или токен - PullRequest
3 голосов
/ 09 февраля 2011

При работе со строками (у них есть свое собственное состояние, такое как комментарии), мне нужно выяснить, является ли следующая буква "или нет". Если это так, я не заканчиваю состояние строки. Так что же происходит, я просто не заканчиваю строка в моем состоянии строки (я использую <STRING_STATE>. и обрабатываю ее буква за буквой). Итак, что происходит, я отмечаю, если последняя строка была ", и если нет тока, я выхожу из состояния и вынимаю последнюю букву.

Это странный эффект. Когда я получаю ошибки в строках со строками, я вижу букву (обычно ',' или ')') дважды. и если он окажется в конце строки, побочный эффект будет считаться двумя строками! (даже если ошибки нет).

Как я могу решить это? мой единственный вариант - создать глобальную переменную и пометить ее, когда я покидаю строковое состояние и хакую YY_USer, чтобы исправить себя? Я хочу избежать этого. Чтобы быть чище, я мог бы просто посмотреть на следующую букву или жетон, это возможно?

1 Ответ

9 голосов
/ 13 февраля 2011

В flex вы можете «смотреть вперед» на будущие токены с помощью оператора / lookahead.таким образом, правило типа

ab/cd

будет соответствовать входу 'ab' тогда и только тогда, когда за ним следует 'cd'.Это означает, что flex на самом деле соответствует 'cd' для этого правила, но затем помещает его обратно во входной буфер перед вызовом действия для правила, поэтому yytext содержит только 'ab', когда вы его видите, и 'cd' будетпрочитайте еще раз для следующего токена

...