нет ошибок при разборе пустого файла yacc/lex

У меня есть синтаксический анализатор, сгенерированный из yacc/lex. Он отлично работает для всех правил, которые я установил, кроме одного случая.

Если файл, который анализирует этот парсер, пуст, он выдает ошибку. Я хочу добавить правило, чтобы оно не выдавало ошибку, когда файл пуст. Я не добавил никаких проверок ни в один из моих файлов .l/.y.

Как это можно сделать с помощью YACC/LEX?

Заранее спасибо !!


person nav_jan    schedule 15.06.2012    source источник


Ответы (1)


Лексер должен распознать конец ввода и соответственно вернуть токен (например, EOF).

Начальное правило вашей грамматики может выглядеть так:

%start program

...

program : EOF 
        | instructions EOF
        ;

Как указал Айра Бакстер, простого «пустого» правила также будет достаточно. В руководстве GNU bison приводится пример:

input   : /* empty */
        | input line
        ;
person Linus Kleen    schedule 15.06.2012
comment
как вы предложили, я попытался распознать EOF в лексере, я обнаружил это с помощью . { if(yytext[0]==EOF){ return tk_eof; } }, но путем отладки я узнал, что эта проверка никогда не выполняется, я делаю что-то здесь неправильно? - person nav_jan; 15.06.2012
comment
Я думаю, вам лучше использовать правило End-Of-File . - person Linus Kleen; 15.06.2012
comment
Почему он не может просто написать: программа : ‹yacc_epsilon› | инструкция? - person Ira Baxter; 15.06.2012
comment
@LinusKleen Спасибо!! эта ссылка в вашем последнем комментарии очень помогла. - person nav_jan; 15.06.2012