是否可以?有什么可用的工具吗?
最佳答案
您可以使用任何允许您访问基本语法的系统来执行此操作。 ANTLR 和 YACC 会编译您的语法,因此您不再拥有它们。在ANTLR的情况下,语法已经变成了代码;你不会拿回来的。在 YACC 的情况下,您最终会得到包含语法本质的解析器表;如果您足够了解这些解析表以执行我在下面描述的操作,您就可以遍历这些解析表。
遍历一组明确表示的语法规则并随机选择扩展/派生是很容易的。根据定义,这将为您提供有效的语法。
它不会做的是让你得到有效的代码。这里的问题是大多数语言确实有上下文敏感的语法;大多数程序都是无效的,除非声明的标识符以与其声明和范围规则一致的方式使用。后者需要完整的语义检查。
我们的 DMS Software Reengineering Toolkit用于解析任意语言的代码 [使用语法],构建 AST,让您分析和转换这些树,最后漂亮地打印有效(句法)文本。 DMS 提供对语法规则和树构建工具的直接访问,因此生成随机句法树(和 pretty-print )非常容易。使用 DMS 也很难确保它们在语义上有效。但是,许多 DMS 的前端可以采用(随机)树并进行语义检查,因此至少您知道树在语义上是否有效。
如果它说“不”,你会怎么做仍然是一个问题。也许您可以以至少保证使用不一致的方式生成标识符名称,但我怀疑这将取决于语言。
关于antlr - 基于 yacc/bison/ANTLR 语法生成随机但仍然有效的表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11187581/