有没有 Yacc 语法调试器?

11

我一直在帮助增强公司内部的一种20多年专有语言。它是一种大型、图灵完备的语言。将其翻译成其他语法体系(如Antlr)不是一个选项(这不由我决定)。

在大多数情况下,扩展语法都很顺利。但偶尔会出现减少-减少或移位-减少的情况

  • 很难消除
  • 有时根本没有意义(对我这个脑子笨的人来说)

经过漫长而痛苦地查看 y.output文件和实验性的语法重构后,我通常能够得到我想要的结果。有时我不得不做出不满意的妥协。

那么,有没有工具可以吸入yacc语法,增强浏览、实验和允许调试更改?

如果我添加一个产生式,我想看到的不止是“用于所有地方的原子产生式”(比如标识符)“与规则foo冲突”(是的,还有更多的信息,s/r,r/r,但我想你明白我的意思)。除了戴上我的头脑风暴帽子,试图想象符号栈和状态机的相互作用之外,还会有一些提示是很好的。

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

我的目标是寻找能够增强 yacc 附带的语法调试工具的 外部 工具。默认集合今天很痛苦。帮我找到更好的交互式工具,比如您可以与Antlr一起使用的那些工具。

2个回答

8
可能会从yacc -d获得一些帮助,它会生成调试输出--基本上会给出符号堆栈状态等的完整列表。输出是密集和繁多的,因此直接尝试阅读所有内容很少有成就感(至少对我来说是这样)。然而,当您进行更改并导致(例如)r/r冲突时,可以在旧语法和新语法上运行yacc -d,然后在结果上运行diff,以获取更详细的运行状况,了解哪些更改导致了冲突。
然而,值得注意的是,s/r冲突通常是良性的--除非您相当确定它是个问题,否则尝试“修复”它通常不值得。但是,对于r/r冲突则不是如此。虽然这些有时是良性的,但相对较少发生。
编辑:糟糕--抱歉,应该是-v。您提到y.output,因此您显然已经知道如何执行该部分。重点是您不要直接查看y.output文件,而是在干净输出和未能成功处理的输出之间进行差异比较,以获取有关实际冲突的一些详细信息(而无需盯着10亿行“东西”看)。

我不确定你的意思。在我们两个的yacc中,-d的意思是“为标记宏输出头文件”。我刚刚添加了更多关于使用开关--report=itemset的信息。这是你所说的吗?它会生成一个名为y.output的文件,其中包含所有状态转换信息。我正在使用它,但希望有一个更强大、交互式的工具。 - Don Wakefield
1
杰瑞是正确的,S/R冲突并不一定是bug。几乎每个真实语法都有很多这样的冲突。 - DigitalRoss

2

谢谢,我已经在使用yacc本身的这些功能了。有时候感觉还不够。;^)~ - Don Wakefield

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接