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

问题描述 投票:0回答:2

仍在学习 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
我想在这里停止解析吗?

parsing error-handling yacc
2个回答
5
投票

您可以根据您的具体需要使用宏

YYERROR
YYABORT
YYABORT
导致 yyparse 立即返回失败,而
YYERROR
导致它表现得好像出现了错误并尝试恢复(如果无法恢复,将返回失败)。

您还可以使用

YYACCEPT
使 yyparse 立即返回成功。


0
投票

就我而言,我想在词法分析时停止解析,YYERROR、YYABORT 可能不可用。你可以只返回 YYerror,它在 y.tab.h 中定义,如下所示:

'[^'\n]*$                { yyerror("Unterminated string");  return YYerror;}
为什么它有效?请看图片代码。

© www.soinside.com 2019 - 2024. All rights reserved.