Я пытаюсь разобрать два файла с помощью win flex и bison, но я столкнулся с проблемой, когда lex не находится в состоянии, которое я ожидаю. В ЛЕКС файле:Неверное состояние lex при разборе нескольких файлов
include[ \t]+\" { BEGIN(include_state); }
<include_state>([^\\\"\n]|\\.)+ {
yyin = fopen(yytext, "r");
if (!yyin) {
printf("Error opening include file: %s\n", yytext);
return 1;
}
yypush_buffer_state(yy_create_buffer(yyin, YY_BUF_SIZE, yyscanner),
yyscanner);
BEGIN(INITIAL);
}
<include_state>\"[ \t]*";" { BEGIN(INITIAL); }
<<EOF>> {
yypop_buffer_state(yyscanner);
if (!YY_CURRENT_BUFFER)
yyterminate();
}
Первый файл разбираемый включает в себя второй файл следующим образом:
include "hello.txt";
Что происходит при разборе, что второй файл («hello.txt») анализируется OK без проблем, но есть проблема при возврате в первый файл. Чтение цитаты и полуплоскости в конце строки читается, но lex находится в состоянии INITIAL. Поэтому lex не соответствует правилу, которое я ожидаю от него. Я знаю это точно, потому что, если я добавлю следующее правило (это соответствует):
<INITIAL>\"[ \t]*";" { printf("Right matching, wrong state.\n"); return 1; }
Почему не вернуться к include_state и как я могу это исправить?
Я ответил на этот вопрос в своем предыдущем вопросе: Условие пуска * не * часть состояния буфера, поэтому вам нужно управлять им отдельно. В этом случае самым простым решением было бы прочитать закрытие '' 'перед тем, как сделать include. – rici