Как заставить lex / flex распознавать токены, не разделенные пробелами?
Я беру курс по построению компилятора, и мое текущее назначение - написать лексер для языка, который мыРеализация. Я могу't выяснить, как выполнить требование, согласно которому лексер должен распознавать составные токены. То есть токены не разделены пробелами. Например: строка39if
должен быть признан как число39
и ключевое словоif
, Одновременно лексер должен такжеexit(1)
когда он сталкивается с неверным вводом.
Упрощенная версия кода у меня есть:
%{
#include
%}
%option main warn debug
%%
if |
then |
else printf("keyword: %s\n", yytext);
[[:digit:]]+ printf("number: %s\n", yytext);
[[:alpha:]][[:alnum:]]* printf("identifier: %s\n", yytext);
[[:space:]]+ // skip whitespace
[[:^space:]]+ { printf("ERROR: %s\n", yytext); exit(1); }
%%
Когда я запускаю это (или мою полную версию) и передаю ему ввод39if
, правило ошибки совпадает и выводERROR: 39if
, когда я'мне бы хотелось, чтобы это было:
number: 39
keyword: if
(Т.е. так же, как если бы я вошел39 if
как вход.)
По инструкцииЯ догадываюсь, что причина в том, что правило ошибки соответствует более длинному вводу, чем правила числа и ключевого слова, и flex это предпочтет. Тем не менее, я понятия не имею, как решить эту ситуацию. Кажется невозможным написать явное регулярное выражение, которое будет отклонять все входные данные без ошибок, и я нене знаю, как еще написатьпоймать всех» Правило ради обработки ошибок лексера.
ОБНОВИТЬ: Я полагаю, я мог бы просто сделать правило всеобъемлющим. { exit(1); }
но я'хотелось бы получить более приятный вывод отладочной информации, чем "Я запутался в строке 1 ".