6

是否可以?有什么可用的工具吗?

4

2 回答 2

2

您可以使用任何可以访问基本语法的系统来执行此操作。ANTLR 和 YACC 将您的语法编译掉,因此您不再拥有它们。在 ANTLR 的例子中,语法已经变成了代码;你不会把它拿回来的。在 YACC 的例子中,你最终得到了包含语法本质的解析器表;如果您对它们的理解足够好,可以执行我在下面描述的操作,那么您可以遍历这些解析表。

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

它不会为您提供有效的代码。这里的问题是大多数语言确实具有上下文相关的语法。除非以符合其声明和范围规则的方式使用声明的标识符,否则大多数程序都是无效的。后者需要完整的语义检查。

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

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

于 2012-06-25T11:13:19.997 回答
1

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

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

您的随机生成器将遍历状态机,在每个状态下进行随机但有效的移位或减少。一旦你到达终端状态,你就有一个有效的输入。

对于状态的人类可读描述,您可以使用-vor--report=state选项来野牛。

恐怕我无法为您指出任何可以做到这一点的现有工具。

于 2012-06-25T23:07:30.567 回答