Как распознать несколько лексических ошибок во входной строке (используя flex)? - PullRequest
1 голос
/ 16 марта 2011

Я использую flex для создания лексического анализатора для пользовательского языка.Проблема, с которой я столкнулся, заключается в том, что как только я нахожу неправильно сформированный токен ... У меня нет возможности сказать, какие другие токены следуют этому.например,

int v1,v2;
v1=10;v2=20;
v1=v2+1v;
print(v1);
~return;

Здесь потоком токенов будет id, <,>, id, <;> ...... язык указывает, что каждый токен должен быть отделен пробелом.Таким образом, просмотр av после 1 должен привести к ошибке, и сканер должен распечатать эту ошибку.После этого есть больше легальных токенов и еще один нелегальный токен (~ return).Как мне обработать остальные легальные токены и напечатать вторую ошибку.Я использую Flex в качестве генератора сканера.Когда я обнаруживаю, что ни одно из регулярных выражений для лексемы не совпадает, я вызываю процедуру ошибки, которая печатает соответствующее сообщение.

Как возобновить обработку после вызова этой подпрограммы?

Ответы [ 2 ]

2 голосов
/ 24 февраля 2014

Поместите пробел в грамматику, если он синтаксически значим. Если это не так, как кажется, здесь нет, просто игнорируйте правило. Пробел имеет только синтаксическое значение, когда требуется разделить токены, например, в int a;.

Например, COBOL имеет правило, что за точкой должен следовать пробел, кроме строки PICTURE. Реализовать правило было сложнее, чем игнорировать его, поэтому я проигнорировал его. Он прошел сертификацию FIPS, и за десять лет никто не заметил, что компилятор использовался в производстве.

NB. Лучший способ обработки недопустимых символов - это ошибки синтаксического анализатора. Таким образом, парсер может применить свою стратегию восстановления после ошибок. На лексическом уровне лучшее, что вы можете, печатать и игнорировать их.

В lex / flex это просто означает наличие окончательного правила, которое гласит:

. return yytext[0];
1 голос
/ 16 марта 2011

Это взлом, но это все, что я мог придумать. В руководстве по Flex говорится, что у вас есть доступ к YY_BUFFER_STATE .

Вы можете иметь возможность использовать текущую позицию в файле, полученную изЧлен yy_input_file в YY_BUFFER_STATE, в сочетании с yyrestart (Файл * f), чтобы возобновить синтаксический анализ сразу после точки ошибки.

Опять кажется, что должно быть лучшее решение.

...