11

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

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

  • 很难消除
  • 有时只是没有意义(对我脆弱的大脑)

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

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

如果我添加一个产品,我希望看到的不仅仅是“到处使用的原子产品”(想想标识符)“与规则 foo 冲突”(是的,有更多的信息,s/r,r/r,比这更多,但我想你明白我的意思)。除了戴上我的思考帽并试图想象一个符号堆栈和状态机之外,如果能有一些相互作用的暗示会很好。

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

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

4

2 回答 2

8

可能会得到一些帮助yacc -d,它会产生调试输出——它基本上给出了符号堆栈状态等的完整列表。输出密集且庞大,因此尝试直接阅读所有内容很少能完成很多工作(无论如何我从来没有这样做过)。但是,当您进行更改时(例如)出现 r/r 冲突,您可以yacc -d在旧语法和新语法上运行,然后对结果运行 diff,以获得更详细的更改(s) 引起冲突。

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

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

于 2009-10-28T23:50:06.077 回答
2

这是我得到的最好的:http: //tldp.org/HOWTO/Lex-YACC-HOWTO-7.html

于 2009-10-28T23:47:35.883 回答