неправильное использование ввода
-
22-08-2019 - |
Вопрос
Я создал test.l, ввод в flex, который заканчивается основной функцией.
Когда основная функция реализована как:
int
main(void)
{
yylex();
return 0;
}
У меня нет никаких проблем.
Я хочу обмануть анализатор, заставив его поверить, что первый символ всегда представляет собой точку с запятой, поэтому я реализовал main как
int
main(void)
{
unput(';');
yylex();
return 0;
}
вышеизложенное приводит к неисправности сегмента.
Почему использование unput приводит к сбою сегмента?
Решение
Это вызывает ошибку сегмента, поскольку yylex() еще не инициализировал входные буферы и т. д.которые необходимы для unput().
Вероятно, есть лучший способ спроектировать сканер без необходимости вводить в него точку с запятой, но если вам необходимо это сделать, то одним из решений может быть использование начальных условий.Что-то вроде этого:
%x SPECIAL
%%
BEGIN(SPECIAL); /* Go to SPECIAL state when yylex first called */
<SPECIAL>. { unput(*yytext); unput(';'); BEGIN(INITIAL); }
... rest of rules ...
Другие советы
Код ниже не является неправильным по смыслу.
int main(void) { unput(';'); yylex(); return 0; }
Проблема возникла из-за flex, который объявил unput
макрос и, конечно же, вы должны были заранее инициализировать lex.
Но если вы поместите свой основной файл за пределы .l file
, ваш код не приведет к сбою.