有 Yacc 语法调试器吗?
Posted
技术标签:
【中文标题】有 Yacc 语法调试器吗?【英文标题】:Are There Yacc Grammar Debuggers? 【发布时间】:2010-12-11 01:58:48 【问题描述】:我一直在帮助增强公司内已有 20 多年历史的专有语言。它是一种大型的图灵完备语言。将其翻译成另一种语法体系(例如 Antlr)不是一种选择(我无法决定这一点)。
在大多数情况下,扩展语法进展顺利。但每隔一段时间我就会得到一个 reduce-reduce 或 shift-reduce
很难消除 有时只是没有意义(对我脆弱的大脑而言)在对 y.output 文件和实验性的语法重构进行了很多痛苦的注视之后,我通常已经到达了我想去的地方。有时我不得不做出不令人满意的妥协。
那么,是否有任何工具可以吸收 yacc 语法,从而增强浏览、试验并允许调试更改?
如果我添加一个产品,我希望看到的不仅仅是“无处不在的原子产品”(想想标识符)“与规则 foo 冲突”(是的,还有更多信息,s/r,r/r ,比那,但我想你明白我的意思)。除了戴上我的思维上限并尝试想象一个符号堆栈和状态机之外,如果能有一些相互作用的暗示会很好。
更新:我想我应该澄清一下。我们使用伯克利 Yacc。我一直在使用最新版本的 Bison 进行测试。对于输出,我使用 --report=itemset 编译了语法。
我写这篇文章的目的是寻找 外部 工具,这些工具增强 yacc 附带的语法调试工具。今天使用默认设置很痛苦。帮助我找到更好的交互工具,例如可以与 Antlr 一起使用的工具。
【问题讨论】:
【参考方案1】:您可能从yacc -d
获得一些帮助,它会产生调试输出——它基本上提供了符号堆栈状态等的完整列表。输出内容密集且庞大,因此尝试直接阅读所有内容很少能完成很多工作(反正我从来没有这样做过)。但是,当您进行更改时(例如)出现 r/r 冲突,您可以在旧语法和新语法上运行 yacc -d
,然后在结果上运行 diff,以获得更详细的结果关于什么变化导致了冲突。
然而,可能值得注意的是,s/r 冲突通常是良性的——除非您相当确定这是一个问题,否则尝试“修复”它通常是不值得的。但是,r/r 冲突并非如此。虽然这些有时是良性的,但比较少见。
编辑:糟糕——抱歉,应该是 -v。你提到了 y.output,所以你显然已经知道如何做那部分了。关键是您不要尝试直接查看 y.output 文件,而是在干净输出的文件和没有获得有关实际冲突的一些细节的文件之间进行比较(而不是盯着 10数以百万计的“东西”行就好了。
【讨论】:
我不确定你的意思。对于我们的 yaccs,-d 的意思是“为令牌宏输出一个头文件”。我刚刚添加了有关使用开关 --report=itemset 的更多信息。这是你的意思吗?它会生成一个文件 y.output,其中包含所有状态转换信息。我正在使用它,但希望有一个更强大的交互式工具。 Jerry 是对的,S/R 冲突不一定是错误。几乎每一个真正的语法都有一堆。【参考方案2】:这是我得到的最好的: http://tldp.org/HOWTO/Lex-YACC-HOWTO-7.html
【讨论】:
谢谢,我已经在使用 yacc 本身的这些功能了。只是有时候感觉还不够。 ;^)~以上是关于有 Yacc 语法调试器吗?的主要内容,如果未能解决你的问题,请参考以下文章