2013-11-15 5 views
0

В моем файле YACC я есть начальный символ «программы», как:Bison end of File дает синтаксическую ошибку?

Program: Declaration Statements E_O_F {/*Semantic Action*/}; 

В E_O_F является маркером, возвращаемый биоэтанол лексере как:

<<EOF>> return E_O_F; 

Но когда я скомпилировать мой файл, всегда есть синтаксическая ошибка, сообщаемая на последней линии + 1-я строка. Lex Файл: File Yacc Файл: File

Вход: test.txt

a=(b); 
b=c+d/e; 
a=3/5-2*4; 
a=a-b; 
if(a>b) 
{ 
    a=a+1; 
} 

Я думаю, что я правильно не возвращает маркер

<<EOF>> 

. Пожалуйста помоги.

ответ

3

Вам не нужно явно возвращать токен EOF, и ваша грамматика не должна пытаться обнаружить EOF.

бизон/Yacc всегда создает неявное правило запуска:

real_start: start <<EOF>> 

где start ваше производство начала, и <<EOF>> является типом маркеров 0.

Кроме того, flex всегда возвращает 0, когда он находит конец ввода.

Таким образом, эти две вещи работают вместе, чтобы вам не нужно беспокоиться о EOF в обычном ходе событий. Тем не менее, они усложняют жизнь, если вы хотите, чтобы ваш синтаксический анализатор разбирал только часть ввода (что не похоже на этот вопрос).

Смежные вопросы