仍在学习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 -block -我可以告诉yyparse我想在这里停止解析吗?

最佳答案

您可以根据需要使用宏YYERRORYYABORTYYABORT导致yyparse失败并立即返回,而YYERROR导致yyparse出现错误并尝试恢复(如果无法恢复,则会返回失败)。

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

07-25 21:53