Parsing 检查两个yacc语法是否相等

Parsing 检查两个yacc语法是否相等,parsing,complexity-theory,Parsing,Complexity Theory,您已经编写了一个yacc语法(或者您选择的工具中的其他一些LALR语法),并且您已经决定要重构一些产品,以提高效率、清晰度等等。例如,您有: xs : xs ';' x | xs ';' | x 您想让它更明显,可以有多个分号,因此您可以将其重写为: semi_plus : semi_plus ';' | ';' xs : xs semi_plus x | x 好吧,看来有道理。。。但我真的正确地进行了重构吗?如果我能将这些声明传递给一个工具,告诉我语法

您已经编写了一个yacc语法(或者您选择的工具中的其他一些LALR语法),并且您已经决定要重构一些产品,以提高效率、清晰度等等。例如,您有:

xs : xs ';' x
   | xs ';'
   | x
您想让它更明显,可以有多个分号,因此您可以将其重写为:

semi_plus : semi_plus ';'
          | ';'
xs : xs semi_plus x
   | x
好吧,看来有道理。。。但我真的正确地进行了重构吗?如果我能将这些声明传递给一个工具,告诉我语法是否等价,那就太好了。(现在,让我们单独考虑我们是否认识同一种语言。)


一个下意识的反应是引用上下文无关的语法等价是不可判定的。事实上,即使是确定CFG是否为正则的问题。但是yacc不识别CFG:它识别确定性上下文无关语法,对于这些语法,我们知道。但是,有人实施过这些决策程序吗?

您提供的文本链接“equivalence is decisable”实际上没有提供与该问题相关的任何参考资料。事实上,当霍普克罗夫特和厄尔曼写下他们宏伟的文本时,还不知道两个DCFL的等价性是否是可判定的。这一事实直到1997年才得到证实,而且目前还不知道是否存在多项式时间算法。在某种程度上,您似乎混淆了规则性和DCFL:DFA的等价性很简单(算法在H&U iirc中),但DCFL可能不是规则的;我确实在某个地方读到DCFL/DPDA等效性是可判定的,但我一定是粘贴了错误的链接。现在链接已修复(根据Bob Atkey的建议,我决定直接链接到Stirling的证明)