我正在使用Bison,我已经生成了一个非常复杂的语法.问题是我的第一个测试案例失败了 - 但Bison只会说"语法错误".有没有办法让Bison输出无法匹配的规则和有问题的令牌?我用了
%define parse.trace true
Run Code Online (Sandbox Code Playgroud)
但仍然只能syntax error作为输出.
当出现问题时,没有一个基于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)其中format和args通常的printf格式和可变参数.如果定义YYDEBUG为非零值但未定义YYFPRINTF,<stdio.h>则会自动包含并YYFPRINTF定义为fprintf.使用跟踪工具编译程序后,请求跟踪的方法是在变量中存储非零值
yydebug.您可以通过使C代码执行此操作(可能在main中),或者您可以使用C调试器更改该值.解析器在
yydebug非零时采取的每个步骤都会生成一行或两行跟踪信息stderr.跟踪消息告诉您这些事情:
- 每次解析器调用时
yylex,都会读取哪种令牌.- 每次移动令牌时,状态堆栈的深度和完整内容(参见章节5.5 [分析器状态],第95页).
- 每次规则减少,规则是什么,以及之后的状态堆栈的完整内容.
| 归档时间: |
|
| 查看次数: |
8027 次 |
| 最近记录: |