有可能吗?有什么可用的工具吗?
答案 0 :(得分:2)
您可以使用任何可以访问基本语法的系统来执行此操作。 ANTLR和YACC编译你的语法,所以你不再拥有它们了。在ANTLR的情况下,语法已经变成了代码;你不会回来的。在YACC的情况下,你最终得到了解析表,其中包含语法的本质;你可以走这样的解析表,如果你理解它们就足以做我在下面描述的那样。
遍历一组明确表示的语法规则并随机选择扩展/派生很容易。根据定义,这将为您提供有效的语法。
它不会做的是为您提供有效的代码。这里的问题是大多数语言都有上下文敏感的语法;除非声明的标识符以与其声明和范围规则一致的方式使用,否则大多数程序无效。后者需要进行全面的语义检查。
我们的DMS Software Reengineering Toolkit用于解析任意语言的代码[使用语法],构建AST,让您分析和转换这些树,最后使用有效(语法)文本。 DMS提供对语法规则和树构建工具的直接访问,因此生成随机语法树(和prettyprint)非常容易。确保它们在语义上有效也很难用DMS;但是,DMS的许多前端可以采用(随机)树并进行语义检查,所以至少你知道树是否在语义上有效。
如果说“不”仍然是个问题,你会怎么做。也许您可以生成标识符名称,以保证至少不一致的使用,但我怀疑这将是依赖于语言的。
答案 1 :(得分:2)
yacc和bison将你的语法变成有限状态机。您应该能够随机遍历状态机以查找有效输入。
基本上,在每个状态下,您可以将新令牌转移到堆栈并移动到新状态,或者根据一组有效的减少量减少堆栈中的顶部令牌。 (有关其工作原理的详细信息,请参阅Bison manual。)
您的随机生成器将遍历状态机,在每个状态下进行随机但有效的移位或缩减。到达终端状态后,您将获得有效输入。
有关状态的人类可读描述,您可以使用-v
或--report=state
选项进行野牛。
我担心我无法指出任何能够做到这一点的现有工具。