c++ - 有 Yacc 语法调试器吗?

标签 c++ debugging yacc visualizer

我一直在帮助扩充我公司内一种已有 20 多年历史的专有语言。它是一种大型的图灵完备语言。将它翻译成另一种语法体系(例如 Antlr)不是一种选择(我无法决定这一点)。

在大多数情况下,扩展语法进行得很顺利。但每隔一段时间我就会得到一个 reduce-reduce 或 shift-reduce

  • 很难消除
  • 有时(对我虚弱的大脑)来说是没有意义的

在痛苦地盯着 y.output 文件和实验性语法重构之后,我通常已经到达了我想去的地方。有时我不得不做出无法令人满意的妥协。

那么,是否有任何工具可以吸收 yacc 语法,从而增强浏览、试验并允许调试更改?

如果我添加一个产生式,我希望看到的不仅仅是“无处不在的原子产生式”(想想标识符)“与规则 foo 冲突”(是的,有更多信息,s/r,r/r ,但我想你明白我的意思了)。除了戴上我的思维帽并尝试想象一个符号堆栈和状态机之外,如果能得到一些相互作用的提示,那就太好了。

更新:我想我应该澄清一下。我们使用伯克利 Yacc。我一直在使用最新版本的 Bison 进行测试。对于输出,我使用 --report=itemset 编译了语法。

我写这篇文章的目的是寻找外部工具来增强 yacc 附带的语法调试工具。今天使用默认设置很痛苦。帮我找到更好的交互工具,比如那些可以与 Antlr 一起使用的工具。

最佳答案

可能yacc -d 得到一些帮助,它产生调试输出——它基本上给出了符号堆栈状态等的完整列表。输出密集而庞大,因此尝试直接阅读所有内容很少能取得多大成就(反正对我来说从来没有)。但是,当您进行更改时(例如)会产生 r/r 冲突,您可以在旧语法和新语法上运行 yacc -d,然后在结果上运行 diff,以获得更详细地说明是什么变化导致了冲突。

然而,可能值得注意的是,s/r 冲突通常是良性的——除非您相当确定这是一个问题,否则尝试“修复”它通常是不值得的。但 r/r 冲突并非如此。虽然这些有时是良性的,但相对较少。

编辑:糟糕——抱歉,应该是 -v。你提到了 y.output,所以你显然已经知道如何做那部分了。关键是您不要尝试直接查看 y.output 文件,而是在干净输出的文件和未输出的文件之间进行比较,以获取有关实际冲突的一些细节(不要盯着 10数以亿计的“东西”,这很好。

关于c++ - 有 Yacc 语法调试器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1640847/

相关文章:

visual-studio - 为什么我的调试器会随机跳出 Debug模式?

javascript - WebStorm 调试 javascript 如此快速地停止和断开连接

c - 在 yacc 和 lex char 数组中制作计算器

c++ - 如何让 yacc/bison 和 lex/flex 暂停文件扫描?

c++ - 第一次方法调用比使用相同数据的连续调用花费的时间长 10 倍

c++ - 使用 C 中的 Lua API 覆盖内置类型的运算符

c++ - 继承的友元

java - 为 rhino 构建 java 脚本调试器

c - Flex 和 Bison 在使用结构体指针作为 union 类型时会出现问题

c++ - 检查一个数字是否出现在数组C++中