提问人:Rob Walker 提问时间:9/9/2008 最后编辑:Mihai LimbășanRob Walker 更新时间:9/17/2015 访问量:2341
BNF 语法测试用例生成 [已关闭]
BNF grammar test case generation [closed]
问:
我们不允许提出有关书籍、工具、软件库等建议的问题。您可以编辑问题,以便用事实和引文来回答。
8年前关闭。
有没有人使用过从 BNF 语法生成测试字符串的工具,然后可以将其输入到单元测试中?
答:
我没有工具问题的答案,但我会说在任何文本处理语言(perl/python/etc)中,从 BNF 语法随机生成句子都相当容易,而在更大的语言(Java/C/etc)中则稍微冗长一些,但推出自己的句子应该不会太难。
当然,这样做的问题在于它只能在语法中生成字符串,除非你的语法非常简单,否则测试空间是无限大的。
我已经完全按照 hazzen 评论的那样做了(在脚本语言中使用嵌入式 DSL)。这是一个稍微有趣的练习,但除了最基本的测试,例如解析,它并没有太大的用处。我最有趣的大多数测试都与更复杂的关系有关,而不是在BNF(或任何其他上下文无关语法)中轻松表达的关系。
比如说,如果你正在开发一个编译器,那么你可能有一个抽象的语法树数据类型。如果是这样,那么你可以编写一个函数来生成一个随机的 AST——有了它,你可以把它打印成一个字符串,并将其提供给你的单元测试。这种方式可以保证它是一个有效的程序,因为你是从 AST 开始的。
如果我用Haskell或ML编写编译器,我会使用QuickCheck。
Gramtest 就是这样一种工具,它可以从任意用户定义的 BNF 语法生成字符串。您可以在此处阅读有关 Gramtest 背后的算法的更多详细信息,并在此处提供有关该工具的一些实用技巧。
上一个:从网页获取国际字符?[复制]
下一个:从 C 打印堆栈跟踪信息#
评论