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

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

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

经过多次痛苦的凝视 y.输出 文件和实验性语法重构,我通常都能到达我想去的地方。有时我不得不做出一些令人不满意的妥协。

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

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

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

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

有帮助吗?

解决方案

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

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

编辑:哎呀——抱歉,应该是-v。您提到 y.output,所以您显然已经知道如何执行该部分。要点是,您不要尝试直接查看 y.output 文件,而是在干净地输出的文件和未输出的文件之间进行比较,以获得有关实际冲突的一些详细信息(不要盯着 10数十亿行“东西”就很好了。

其他提示

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top