野牛错误输出

Pup*_*ppy 4 bison

我正在使用Bison,我已经生成了一个非常复杂的语法.问题是我的第一个测试案例失败了 - 但Bison只会说"语法错误".有没有办法让Bison输出无法匹配的规则和有问题的令牌?我用了

%define parse.trace true
Run Code Online (Sandbox Code Playgroud)

但仍然只能syntax error作为输出.

Jon*_*ler 8

当出现问题时,没有一个基于Yacc的解析器能比"语法错误"做得更好; 在很大程度上由你来改进.

你可以很容易地做一些事情.

一种方法是检测词法分析器,使其打印出它找到的标记,因为它将它们返回到正确的解析器.这会告诉您语法失败的标记,以及事先提供的标记.

另一种是在启用Yacc调试的情况下进行编译,然后将其打开.这需要-DYYDEBUG=1并将变量设置为yydebug非零值(通常为1).第一步是将额外的信息编译成语法; 第二步启用输出.

从Bison 2.4.3手册:

§8.2跟踪解析器

如果Bison语法编译正确但在运行时没有按照您的要求进行编程,则yydebug解析器跟踪功能可以帮助您找出原因.

有几种方法可以编译跟踪设施:

  • YYDEBUG

    YYDEBUG编译解析器时将宏定义为非零值.这符合POSIX Yacc.您可以使用-DYYDEBUG=1编译器选项,也可以放入#define YYDEBUG 1语法文件的序言(参见章节3.1.1 [序言],第47页).

  • 选项-t,--debug

    -t运行Bison时使用该选项(请参阅第9章[调用Bison],第107页).这也符合POSIX标准.

  • 指令 %debug

    添加%debug指令(参见章节3.7.12 [Bison声明摘要],页面72).这是一个Bison扩展,当Bison为不使用预处理器的语言输出解析器时,它将证明是有用的.除非POSIX和Yacc可移植性对您很重要,否则这是首选解决方案.

我们建议您始终启用调试选项,以便始终可以进行调试.

跟踪工具使用表单的宏调用输出消息,YYFPRINTF (stderr, format, args)其中formatargs通常的printf格式和可变参数.如果定义YYDEBUG为非零值但未定义YYFPRINTF,<stdio.h> 则会自动包含并YYFPRINTF定义为fprintf.

使用跟踪工具编译程序后,请求跟踪的方法是在变量中存储非零值yydebug.您可以通过使C代码执行此操作(可能在main中),或者您可以使用C调试器更改该值.

解析器在yydebug非零时采取的每个步骤都会生成一行或两行跟踪信息stderr.跟踪消息告诉您这些事情:

  • 每次解析器调用时yylex,都会读取哪种令牌.
  • 每次移动令牌时,状态堆栈的深度和完整内容(参见章节5.5 [分析器状态],第95页).
  • 每次规则减少,规则是什么,以及之后的状态堆栈的完整内容.


ale*_*cov 5

使用该%error-verbose指令来帮助您.它将为您提供解析器所期望的令牌的提示.请注意,可能存在多个未能匹配的潜在规则.