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

基于yacc/bison/ANTLR语法生成随机但仍然有效的表达式,antlr,bison,yacc,Antlr,Bison,Yacc,可能吗?任何可用于此的工具?您可以在任何允许访问基本语法的系统上执行此操作。ANTLR和YACC编译掉你的语法,这样你就不会再有它们了。在ANTLR的例子中,语法已经变成了代码;你不会把它拿回来的。在YACC的例子中,您将得到解析器表,其中包含语法的精髓;如果您对这些解析表有足够的了解,能够完成我在下面描述的工作,那么您可以遍历这些解析表 遍历一组显式表示的语法规则并随机选择扩展/派生非常容易。根据定义,这将获得有效的语法 它不会让你得到有效的代码。这里的问题是大多数语言都有上下文敏感的语法;大

可能吗?任何可用于此的工具?

您可以在任何允许访问基本语法的系统上执行此操作。ANTLR和YACC编译掉你的语法,这样你就不会再有它们了。在ANTLR的例子中,语法已经变成了代码;你不会把它拿回来的。在YACC的例子中,您将得到解析器表,其中包含语法的精髓;如果您对这些解析表有足够的了解,能够完成我在下面描述的工作,那么您可以遍历这些解析表

遍历一组显式表示的语法规则并随机选择扩展/派生非常容易。根据定义,这将获得有效的语法

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

我们的应用程序用于解析任意语言的代码[使用语法],构建AST,让您分析和转换这些树,最后预打印有效(语法)文本。DMS提供了对语法规则的直接访问和树构建功能,因此生成随机语法树(和预打印)非常容易。确保它们在语义上是有效的对于DMS来说也是困难的;然而,DMS的许多前端可以采用(随机)树并进行语义检查,因此至少您可以知道该树在语义上是否有效


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

yacc和bison将您的语法转换为有限状态机。您应该能够随机遍历状态机以找到有效的输入

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

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

对于状态的可读描述,您可以使用bison的
-v
--report=state
选项


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

没有收到您的问题,如果不是,请详细说明,而不是flex。你知道,yacc/bison/ANTLR使用特定语法解析表达式。我需要生成对指定语法有效的随机表达式。例如,使用计算器语法,我希望有一个工具可以无限和随机地生成“1+2+3”、“1+4*8”等表达式。@nav jan:为什么这很容易?没有备份的断言实际上没有帮助。(好吧,一个数字计算器langauge可能很容易)Haskell的可能在这方面有所帮助。您可能会为编写语法(比如yacc for Haskell),然后使用快速检查生成随机树。诚然,您可以跳过Happy,只使用QC为给定的数据定义生成随机AST。目的是什么?目的是什么?当然是测试!:)是的,名字是下一个问题。。。作为第一步,我需要生成随机AST。