сканер lex flex с несколькими буферами - PullRequest
0 голосов
/ 01 ноября 2011

Я хочу использовать yy_scan_bytes (), поскольку у меня есть нулевые символы, определяющие правило. Моя проблема в том, что моя строка может соответствовать более чем одному правилу. Я хочу овладеть всеми правилами. Я хочу передать функции yylex () по одному символу за раз и проверить, совпадает ли что-нибудь. Я попробовал следующий код для тестирования, но это не работает.

for(int i=0;i<length;i++)
{
    yy_scan_bytes(&temp[i],1 );
    index=TomsonTalkslex();
}

Для простоты я просто возвращаю индекс правила, сопоставленного со сканером. temp - это буфер символов. Я пытался использовать yy_switch_to_buffer (yy_scan_bytes (& temp [i], 1)); но это не сработало.

Как я могу сказать сканеру не сбрасывать его состояние и продолжить обработку последующих буферов с тем же состоянием.

1 Ответ

2 голосов
/ 01 ноября 2011

Хорошо, это просто неправильное понимание того, как работает 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 для более подробного ознакомления.

...