我想为保姆树开发Java语法,该树似乎已经被遗弃了几个月。最好使用基于属性的测试,所以我考虑是否存在可以以某种方式接受给定语法并用于从中生成随机AST和代码的工具。
所以属性看起来像
data OtherValidJavaAst = undefined
data TreeSitterAst = undefined
transform : TreeSitterAst -> OtherValidJavaAst
genAst : Gen OtherValidAst
genCode : OtherValidAst -> String
parseTreeSitter : String -> TreeSitterAst
parsesEqually : ValidJavaAst -> Boolean
parsesEqually ast = transform (parseTreeSitter (genCode ast)) == ast
答案 0 :(得分:0)
您追求的似乎是给定语言的句子生成。作为示例,一段Java代码是整个Java语言的句子。但是,由于递归和循环,即使是非常基本的语法,给定语法的有效句子数实际上是无限的。因此,这是一件棘手的事情,我不知道有什么工具可以做到,除了我自己写的一个(作为我的vscode ANTLR4 extension的一部分)之外,我仍然在开发它。
但是,您可以做的是通过限制递归和迭代,将生成过程限制为完整语言的子集。但是,这里的一个重要方面是:什么是语言的良好代表?
这里的另一点是:您不能使用从语法生成的句子来测试该语法,因为它总是会成功的,因为句子是从该语法生成的,因此必须是有效的。 / p>