bison/flex: просмотреть следующую букву или токен

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

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

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


person Community    schedule 09.02.2011    source источник
comment
Здравствуйте, я удалил тег flex, поскольку он связан с языком программирования Adobe, и вместо этого добавил более подходящий тег gnu-flex.   -  person Andrea Spadaccini    schedule 09.02.2011
comment
@Andrea Spadaccini: Приятно знать, сегодня я впервые увидел тег gnu-flex   -  person    schedule 09.02.2011
comment
Я тоже в первый раз :) Я заметил ошибку, потому что увидел значок Adobe рядом с тегом бизона.. немного подозрительно ;)   -  person Andrea Spadaccini    schedule 09.02.2011
comment
Пожалуйста, опубликуйте ту часть грамматики, которая вас беспокоит. Без этого очень сложно найти решение вашей проблемы.   -  person Tim Landscheidt    schedule 28.03.2012


Ответы (1)


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

ab/cd

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

person Chris Dodd    schedule 13.02.2011