Как заставить 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 ".

Ответы на вопрос(1)

Ваш ответ на вопрос