Вопрос

Я создал 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, ваш код не приведет к сбою.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top