基于yacc / bison / ANTLR语法生成随机但仍然有效的表达式

时间:2012-06-25 10:28:46

标签: antlr bison yacc

有可能吗?有什么可用的工具吗?

2 个答案:

答案 0 :(得分:2)

您可以使用任何可以访问基本语法的系统来执行此操作。 ANTLR和YACC编译你的语法,所以你不再拥有它们了。在ANTLR的情况下,语法已经变成了代码;你不会回来的。在YACC的情况下,你最终得到了解析表,其中包含语法的本质;你可以走这样的解析表,如果你理解它们就足以做我在下面描述的那样。

遍历一组明确表示的语法规则并随机选择扩展/派生很容易。根据定义,这将为您提供有效的语法。

它不会做的是为您提供有效的代码。这里的问题是大多数语言都有上下文敏感的语法;除非声明的标识符以与其声明和范围规则一致的方式使用,否则大多数程序无效。后者需要进行全面的语义检查。

我们的DMS Software Reengineering Toolkit用于解析任意语言的代码[使用语法],构建AST,让您分析和转换这些树,最后使用有效(语法)文本。 DMS提供对语法规则和树构建工具的直接访问,因此生成随机语法树(和prettyprint)非常容易。确保它们在语义上有效也很难用DMS;但是,DMS的许多前端可以采用(随机)树并进行语义检查,所以至少你知道树是否在语义上有效。

如果说“不”仍然是个问题,你会怎么做。也许您可以生成标识符名称,以保证至少不一致的使用,但我怀疑这将是依赖于语言的。

答案 1 :(得分:2)

yacc和bison将你的语法变成有限状态机。您应该能够随机遍历状态机以查找有效输入。

基本上,在每个状态下,您可以将新令牌转移到堆栈并移动到新状态,或者根据一组有效的减少量减少堆栈中的顶部令牌。 (有关其工作原理的详细信息,请参阅Bison manual。)

您的随机生成器将遍历状态机,在每个状态下进行随机但有效的移位或缩减。到达终端状态后,您将获得有效输入。

有关状态的人类可读描述,您可以使用-v--report=state选项进行野牛。

我担心我无法指出任何能够做到这一点的现有工具。