2012-10-31 23 views
1

语法错误,这只是一个例子YACC表示在错误的位置

YACC语法:

abc:ABC STRING NEWLINE 

end:END 

. 

. 

法文件:

int lineno=1; 

. 

. 

string [a-zA-Z]+ 

%% 

ABC {return ABC;} 

END {return END;} 

[\n] {lineno++;return NEWLINE;} 

{string} {return STRING;} 

%% 

和在NEWLINE LINENO的每一次出现被递增 如果输入文件是:

ABC xyz 

END 

YACC解析这个成功

如果输入文件是:

ABC 123 

END 

它显示1行:语法错误

这是预期

,但如果输入文件是:

ABC 

END 

那么它显示2号线:语法错误

但是误差在1号线不符合2

可以做些什么,以便显示正确的路线没有?

回答

3

因为解析器在收到词法分析器中的NEWLINE标记之前没有找到错误,并且您已经增加了行号。

这实际上并不罕见,在错误的行上显示错误。一个很好的例子,如果你忘记把一个分号(;)放在C语言源文件的语句末尾。该错误很可能在下一行。

编辑: Yacc错误恢复处理。

Yacc有一个特殊的终端符号error它可以用于错误恢复。在你的情况下,它可以使用这样的:

abc:ABC STRING NEWLINE 
    |error NEWLINE 
    ; 

您可以添加的errorNEWLINE符号之间的代码块打印错误消息,但可能无法工作,反正作为分析器不知道有是一个错误,直到它看到了NEWLINE符号。

+0

有什么办法可以检查NEWLINE之前发生的这种缺失值吗? – Tanya

+0

@Tanya您可以添加一个带有特殊错误终端符号的规则,但它可能无法正常工作。 –

+0

可以将错误报告为:上述情况下的“ABC错误”? – Tanya

0

您可以保守地将您的语法错误消息说成是类似于“行号%d附近的语法错误”。