Parsing 使用yacc时,如何告诉yyparse()您要停止解析?

Parsing 使用yacc时,如何告诉yyparse()您要停止解析?,parsing,error-handling,yacc,Parsing,Error Handling,Yacc,仍在学习yacc和flex,并遇到了一个操作指南和教程中没有介绍的场景。我正在尝试解析一个文件,并且在进行过程中,我正在对我放入parser.y文件中的代码执行一些次要错误检查。当我遇到字典正确(即语法正确匹配)但逻辑不正确(意外值或不正确值)的东西时,我如何让yyparse退出?另外,我可以让它返回一个错误代码给我,我可以在我的呼叫代码检查 /* Sample */ my_file_format: header body_lines footer ; header: OBRACE

仍在学习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 ... */

我意识到在我的示例中,我可以简单地使用规则查找“人为的示例”,但我的观点是在
if
-块中——我可以告诉
yyparse
我想在这里停止解析吗?

你可以使用宏
yyrerror
YYABORT
,具体取决于你想要什么
YYABORT
导致yyparse立即返回并出现故障,而
YYERROR
使其像发生错误一样运行并尝试恢复(如果无法恢复,将返回故障)


您还可以使用
yyaccpt
使yyparse立即返回成功。

+1几乎是我想要的-它确实退出解析,尽管是以一种相当突然的方式。