提问人:Edward Z. Yang 提问时间:12/22/2016 最后编辑:Edward Z. Yang 更新时间:12/23/2016 访问量:421
检查两个 yacc 语法是否等效
Checking if two yacc grammars are equivalent
问:
你已经编写了一个 yacc 语法(或者你选择的工具中的其他一些 LALR 语法),并且你已经决定要重构一些产品以提高效率、清晰度等等。例如,您有:
xs : xs ';' x
| xs ';'
| x
您想更清楚地说明可以有多个分号,因此将其重写为:
semi_plus : semi_plus ';'
| ';'
xs : xs semi_plus x
| x
好吧,所以,看起来很有道理......但是我真的正确地进行了重构吗?如果我能把这些声明传递给一个工具,告诉我语法是否等效,那就太好了。 (现在,让我们只考虑我们是否承认相同的语言的问题。
一种下意识的反应是引用上下文无关语法等价是无法确定的。事实上,即使是确定CFG是否规则的问题也是无法确定的。但是 yacc 不识别 CFG:它识别确定性上下文自由语法,并且对于这些语法,已知等价是可判定的。但是有没有人实施过这些决策程序?
答: 暂无答案
评论