Хорошо, это просто неправильное понимание того, как работает lex / flex.По умолчанию yylex подключается к стандартному вводу данных, читая до получения EOF и сопоставляя каждое правило.Вот почему это токенизатор.Таким образом, приведенный ниже пример программы будет считываться из stdin до тех пор, пока вы не введете -c для отправки EOF.
%option 8bit outfile="scanner.c"
%option nounput nomain noyywrap
%option warn
%%
ab { fprintf(yyout, "We ran the ab rule.\n"); }
cd { fprintf(yyout, "We ran the cd rule.\n"); }
// echo everything else we find to yyout
. { ECHO; }
\n { ECHO; }
%%
Для компиляции вышеупомянутого используйте:
flex -Cf scanner.l
gcc -O -o flexer.exe scanner.c
Сохраните исходный файл какscanner.l, когда вы делаете это.После компиляции вы получите файл с именем flexer.exe в том же каталоге.Запустите его из терминала, и вы получите пустое приглашение в ожидании ввода.Все, что вы вводите, будет пытаться соответствовать правилам, пока вы не найдете только одно совпадение.Затем он выполнит код, связанный с правилом.
Поэтому, если вы введете abcd
, то вы сопоставите правила ab
и cd
.
Я предлагаю прочитать lex и yacc для более подробного ознакомления.