你已经编写了一个yacc语法(或者你选择的工具中的其他一些LALR语法),并且你已经决定要重构一些产品以提高效率,清晰度等等。例如,你有:
xs : xs ';' x
| xs ';'
| x
您希望更明显的是可以有多个分号,因此您将其重写为:
semi_plus : semi_plus ';'
| ';'
xs : xs semi_plus x
| x
好吧,看起来似乎有道理......但我确实正确地进行了重构吗?如果我能将这些声明传递给一个可以告诉我语法是否等效的工具,那将是很棒的。 (现在,我们只考虑是否识别相同语言的问题。)
一个下意识的反应是引用上下文无关语法等价是不可判定的。事实上,甚至确定CFG是否是常规的问题is undecidable。但yacc不承认CFG:它识别确定性上下文无关语法,对于这些,已知equivalence is decidable。但有没有人实施过任何这些决策程序?