2009-04-01 7 views
2

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

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

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

У меня нет никаких проблем.

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

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

вышеуказанных приводит к неисправности сегмента.

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

ответ

6

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

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

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

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

... rest of rules ... 
+0

Спасибо, что сработал. Я хотел бежать в начале только один раз, я не мог понять, как, теперь мне не нужно прибегать к трюку. –

0

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

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

Проблема возникла из прогибается, который объявлен unput макро и, конечно, вы должны быть инициализирована Лекса прежде.

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