использование unput неправильно - PullRequest
2 голосов
/ 01 апреля 2009

Я создал test.l, ввод для flex, который заканчивается основной функцией.

Когда основная функция реализована как:

int
main(void)
{
    yylex();
    return 0;
}

У меня нет проблем.

Я хочу заставить парсер поверить, что первый символ всегда является точкой с запятой, поэтому я реализовал main как

int
main(void)
{
    unput(';');
    yylex();
    return 0;
}

вышеизложенное приводит к ошибке сегмента.

Почему использование unput приводит к отказу сегмента?

Ответы [ 2 ]

6 голосов
/ 01 апреля 2009

Это вызывает ошибку сегмента, потому что yylex () еще не инициализировал входные буферы и т. Д., Необходимые для unput ().

Вероятно, есть лучший способ спроектировать ваш сканер без необходимости вводить его в начальную точку с запятой, но если вам нужно сделать это, то одним из решений может быть использование условий запуска. Примерно так:

%x SPECIAL
%%
    BEGIN(SPECIAL); /* Go to SPECIAL state when yylex first called */

<SPECIAL>.  { unput(*yytext); unput(';'); BEGIN(INITIAL); }

... rest of rules ...
0 голосов
/ 16 июля 2010

Приведенный ниже код не является неправильным по смыслу.

int main(void) { unput(';'); yylex(); return 0; }

Проблема возникла из-за flex, который объявил макрос unput, и, конечно, вы должны были инициализировать lex раньше.

Но если вы поместите свой основной за пределами .l file, ваш код не будет segfault.

...