我们的脚本语言已经在使用,我们正在通过添加新功能等来改进它。
我的问题是;测试我们的 grammer (不是最终应用程序)以获得向后兼容性的最佳方法是什么?有人知道一个工具,它为我们或一个方法做到了吗?
祝你好运
答案 0 :(得分:3)
测试一种语法是否接受与另一种语言相同的语言,或接受更大的语言,在理论上是困难的,如果不是不可能的话。
作为工程师,我们经常被要求做不可能的事。我们所做的是放松要求,直到我们得到某种有用的答案。放宽要求的一种方法是允许工具在某些情况下说“不知道”。
我的公司基于解析器生成器构建解析器。我们经常处理巨大的语法(成千上万的规则)。我们一直在研究的机制之一是检测语法是否含糊不清。事实上,这在理论上是不可能的,但并没有改变我们对得到答案的兴趣。
我们正在开发一种可以在很多情况下回答这个问题的工具。实际上,它的作用是询问是否有任何非终结符号含糊不清;应用于根语法规则,这直接询问语法是否含糊不清。在所有非终端上尝试它的原因是它们中的许多产生比完整语言更小的子语言,允许对它们进行分析。它通过使用扩展的语法规则对非终结符的扩展进行广度优先搜索来确定这一点。在此搜索过程中会发生以下几种情况之一:
通过记录搜索结果,并在所有语法规则上多次迭代(使用称为“迭代深化”的搜索技术),我们经常可以发现歧义,和/或证明语法的某些部分不含糊。 (已缓存终端/非终端X是否不明确的事实允许检查传递使用X的其他非终结符号Y,以便有效地搜索“更快”或“更深”;这是国际象棋程序中的转置表的旧技巧)。这个答案并不完美,但是当它确定一个模糊性时,确实有一个,当它声称没有一个时,就没有一个。 这是一个很大的帮助。
在我看来,相同类型的搜索应该适用于询问一个语法是否接受另一个语法的超集,假设语法非常相似(例如,你通过修改另一个“略微”而得到一个)。 如果非终结符是其双胞胎的超集,则搜索必须检查语言共享的每个非终结符。同样,你得到的任何答案都不会是完美的,但它可能会在相信兼容性方面有很长的路要走。
我们知道如何做到这一点的唯一另一种方法是运行一系列非常大的综合测试,正如@EJP所指出的那样。