我原来的.y文件导致一些转移/减少和减少/减少冲突 所以我改变了一些规则来消除这些冲突。我可以手动验证新旧版本之间的等效性。
但是,我想验证新版本是否自动等同于原版?怎么样?
答案 0 :(得分:1)
在一般情况下,不可能自动证明等价,因为两个CFG的等价性是不可判定的。可以在任何关于可计算性的教科书中找到这个众所周知的结果的证明。
有一些特殊情况是可判定的,但大多数都不是特别有用。例如,您可以通过简单地枚举所有句子来证明两种有限语言的等价性。您可以通过构造它们各自的最小DFA并进行比较来证明两种常规语言的等价性。等
在yacc / bison的情况下,如果你成功地通过添加适当的优先级声明来“消除”shift-reduce冲突而不进行其他更改(一种经典的方法来“修复”悬空的其他问题),你可以简单地检查一下解析表(或bison的--report
的输出以验证没有更改;也就是说,优先级声明编码了bison的默认冲突解决方案,因此只删除了警告。因为reduce-reduce冲突解决方案不会受到影响优先级,这不适用于删除了reduce-reduce冲突警告的更改,但如果更改足够简单,您仍可以基于比较生成的自动机手动构建证明。
即使你有证据,我想你也想进行详尽的测试。毕竟,证明中可能存在错误。