У меня есть относительно простой файл lex/flex, и я запускаю его с флагом отладки flex, чтобы убедиться, что он правильно токенизируется. К сожалению, я всегда сталкиваюсь с одной из двух проблем: либо программа, которую генерирует flex, останавливается, просто молча сдается после пары токенов, либо правило, которое я использую для распознавания символов и строк, не вызывается, а правило по умолчанию вместо этого вызывается.
Может ли кто-нибудь указать мне в правильном направлении? Я прикрепил свой гибкий файл и пример ввода/вывода.
Изменить: я обнаружил, что сгенерированный лексер останавливается после определенного правила: «cdr». Это более подробно, но и гораздо более запутанно. Я разместил сокращенный модифицированный файл lex.
/* lex file*/
%option noyywrap
%option nodefault
%{
enum tokens{
CDR,
CHARACTER,
SET
};
%}
%%
"cdr" { return CDR; }
"set" { return SET; }
[ \t\r\n] /*Nothing*/
[a-zA-Z0-9\\!@#$%^&*()\-_+=~`:;"'?<>,\.] { return CHARACTER; }
%%
Пример ввода:
set c cdra + cdr b + () ;
Полный вывод после запуска ввода через сгенерированный парсер:
--(end of buffer or a NUL)
--accepting rule at line 16 ("set")
--accepting rule at line 18 (" ")
--accepting rule at line 19 ("c")
--accepting rule at line 18 (" ")
--accepting rule at line 15 ("cdr")
Есть предположения? Сгенерированная программа сдается после половины ввода! (для справки, я делаю ввод, перенаправляя содержимое файла в сгенерированную программу).