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

标签 parsing error-handling yacc

仍在学习 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 导致它表现得好像发生了错误并尝试恢复(如果无法恢复,将返回失败)恢复)。

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

关于parsing - 使用 yacc 时,如何告诉 yyparse() 要停止解析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5161009/

相关文章:

linux - 用于解析的Perl程序结构

error-handling - 使用 clojure core.async 管道处理错误

c++ - 如何从 YACC 获取 AST?

java - 处理 Java Web 应用程序启动错误的正确方法

c# - 错误处理asp.net MVC 5不允许在事件查看器中查看堆栈跟踪

c - yacc-Flex 中的移位/减少冲突

c - 简单的C语言解析器不编译linux机器

html - 使用 Kanna 快速解析 html

c# - C#中的编译器编译器

Java 负整数转十六进制并返回失败