首页 > 解决方案 > antlr 或其他工具可以为给定的语法生成有效代码吗?

问题描述

我想研究似乎被放弃了几个月的树保姆的 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

标签: parsingantlrcode-generation

解决方案


您所追求的似乎是给定语言的句子生成。以一段Java代码为例,就是整个Java语言的一句话。然而,由于递归和循环,给定语法的有效句子数量实际上是无限的,即使对于非常基本的语法也是如此。因此,这是一件棘手的事情,我不知道有什么工具可以做到这一点,除了我自己编写的一个工具(作为我的vscode ANTLR4 扩展的一部分),但它仍在开发中。

但是,您可以做的是,通过限制递归和迭代,将生成过程限制为完整语言的一个子集。然而,这里的一个重要方面是:什么是语言的良好表示?

这里的另一点也是:您不能使用从语法生成的句子来测试该语法,因为这总是会成功,因为句子是从该语法生成​​的,因此必须是有效的。


推荐阅读