2013-11-15 41 views
0

在我的yacc文件中我有一個開始符號的「綱要」爲:文件的野牛末尾給出語法錯誤?

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

的E_O_F是Flex-詞法分析器返回的令牌:

<<EOF>> return E_O_F; 

但是當我編譯我的文件,總是在最後一行+第1行報告語法錯誤。 萊克斯文件: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。然而,如果你希望解析器只解析一部分輸入(在這個問題中似乎不是這種情況),它們的確會使生活複雜化。