仍然在学习yacc和flex,并遇到了我没有涉及的操作方法和教程的场景。我正在尝试解析一个文件,并且随着我的进展,我正在对我放在parser.y
文件中的代码进行一些二次错误检查。当我遇到词典上正确的东西(即,解析正确匹配)但逻辑上不正确(意外值或不适当的值)时,如何让yyparse
退出?另外,我可以将它返回给我的错误代码,我可以在我的调用代码中检查吗?
/* Sample */
my_file_format:
header body_lines footer
;
header:
OBRACE INT CBRACE
|
OBRACE STRING CBRACE {
if ( strcmp ( $1, "Contrived_Example" ) != 0 ) { /* I want to exit here */ }
}
;
/* etc ... */
我意识到在我的例子中我可以简单地使用规则查找“Contrived_Example”,但我的观点是在if
- 块 - 我可以告诉yyparse
我想要停止解析这里吗?
答案 0 :(得分:4)
您可以使用宏YYERROR
或YYABORT
,具体取决于您想要的内容。 YYABORT
会导致yyparse立即返回失败,而YYERROR
会导致它出现错误并尝试恢复(如果无法恢复将返回失败)。
您还可以使用YYACCEPT
使yyparse立即返回成功。