如何测试 yacc/lalr(1) 中的语法更改以实现向后兼容性?
How to test grammar changes in yacc/lalr(1) for backwards compatibilitiy?
我们的脚本语言已经在使用中,我们正在通过添加新功能等来改进它。
我的问题是;测试我们的 grammer(不是结束应用程序)向后兼容性的最佳方法是什么?有谁知道适合我们的工具或方法吗?
此致
测试一种语法是否接受与另一种语法相同的语言,或者接受一种更大的语言,即使在理论上不是不可能的,也是困难的。
作为工程师,我们经常被要求去做不可能的事情。我们所做的是放宽要求,直到我们得到某种有用的答案。放宽要求的一种方法是允许工具在某些情况下说 "don't know"。
我的公司基于解析器生成器构建解析器。我们经常处理大量语法(数千条规则)。我们一直在研究的机制之一是检测语法是否有歧义。众所周知,这在理论上是不可能的,但不会改变我们对获得答案的兴趣。
我们正在开发一种工具,可以在很多情况下回答这个问题。实际上,它所做的是询问是否有任何非终结符不明确;应用于根语法规则,这直接询问语法是否有歧义。在所有非终结符上尝试它的原因是它们中的许多产生比完整语言更小的子语言,允许它们被分析。它通过使用扩展语法规则对非终结符的扩展进行广度优先搜索来确定这一点。在此搜索过程中发生了以下几件事之一:
- 非终结符被证明是明确的
- 显示有歧义,说明主要语法规则有歧义
- 搜索 运行 超出了我们愿意花费的时间。
通过记录搜索结果,并对所有语法规则进行多次迭代(使用一种称为"iterative deepening"的搜索技术),我们经常可以找到歧义,and/or证明部分语法没有歧义。 (缓存 terminal/nonterminal X 是或不是歧义的事实允许检查其他非终结符 Y 传递使用 X,有效地搜索 "faster" 或 "deeper";这是换位的老技巧国际象棋程序中的表格)。这个答案并不完美,但是当它识别出一个歧义时,确实存在一个歧义,而当它声称没有歧义时,就没有一个。
这是一个很大的帮助。
在我看来,相同类型的搜索应该适用于询问一种语法是否接受另一种语法的超集,前提是语法非常相似(例如,您通过修改另一种语法得到了另一种语法 "slightly").
如果该非终结符是其双胞胎的超集,则搜索必须检查语言共享的每个非终结符。同样,您得到的任何答案都不会是完美的,但它可能会大大提高对兼容性的信心。
正如@EJP 指出的那样,我们知道如何做到这一点的唯一其他方法是 运行 一组非常大的综合测试。
我们的脚本语言已经在使用中,我们正在通过添加新功能等来改进它。
我的问题是;测试我们的 grammer(不是结束应用程序)向后兼容性的最佳方法是什么?有谁知道适合我们的工具或方法吗?
此致
测试一种语法是否接受与另一种语法相同的语言,或者接受一种更大的语言,即使在理论上不是不可能的,也是困难的。
作为工程师,我们经常被要求去做不可能的事情。我们所做的是放宽要求,直到我们得到某种有用的答案。放宽要求的一种方法是允许工具在某些情况下说 "don't know"。
我的公司基于解析器生成器构建解析器。我们经常处理大量语法(数千条规则)。我们一直在研究的机制之一是检测语法是否有歧义。众所周知,这在理论上是不可能的,但不会改变我们对获得答案的兴趣。
我们正在开发一种工具,可以在很多情况下回答这个问题。实际上,它所做的是询问是否有任何非终结符不明确;应用于根语法规则,这直接询问语法是否有歧义。在所有非终结符上尝试它的原因是它们中的许多产生比完整语言更小的子语言,允许它们被分析。它通过使用扩展语法规则对非终结符的扩展进行广度优先搜索来确定这一点。在此搜索过程中发生了以下几件事之一:
- 非终结符被证明是明确的
- 显示有歧义,说明主要语法规则有歧义
- 搜索 运行 超出了我们愿意花费的时间。
通过记录搜索结果,并对所有语法规则进行多次迭代(使用一种称为"iterative deepening"的搜索技术),我们经常可以找到歧义,and/or证明部分语法没有歧义。 (缓存 terminal/nonterminal X 是或不是歧义的事实允许检查其他非终结符 Y 传递使用 X,有效地搜索 "faster" 或 "deeper";这是换位的老技巧国际象棋程序中的表格)。这个答案并不完美,但是当它识别出一个歧义时,确实存在一个歧义,而当它声称没有歧义时,就没有一个。 这是一个很大的帮助。
在我看来,相同类型的搜索应该适用于询问一种语法是否接受另一种语法的超集,前提是语法非常相似(例如,您通过修改另一种语法得到了另一种语法 "slightly"). 如果该非终结符是其双胞胎的超集,则搜索必须检查语言共享的每个非终结符。同样,您得到的任何答案都不会是完美的,但它可能会大大提高对兼容性的信心。
正如@EJP 指出的那样,我们知道如何做到这一点的唯一其他方法是 运行 一组非常大的综合测试。