antlr 或其他工具可以为给定的语法生成有效代码吗?

Posted

技术标签:

【中文标题】antlr 或其他工具可以为给定的语法生成有效代码吗?【英文标题】:Can antlr or other tool generate valid code for given grammar? 【发布时间】:2019-06-07 03:54:13 【问题描述】:

我想为tree-sitter 研究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

【问题讨论】:

这样讨论会有点宽泛,因为 ANTLR Java 语法设计者可能会给你一个不同的 AST,github.com/antlr/grammars-v4 不确定这如何回答我的问题。 【参考方案1】:

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

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

这里还有一点:你不能使用从语法生成的句子来测试这个语法,因为这总是会成功,因为句子是从那个语法生成的,因此必须是有效的。

【讨论】:

我不想通过生成句子来测试语法。我正在尝试通过将一个解析器与另一个解析器进行比较来测试它。当然,我希望句子生成应该是可编程的。显然我不需要无限的句子。

以上是关于antlr 或其他工具可以为给定的语法生成有效代码吗?的主要内容,如果未能解决你的问题,请参考以下文章

Antlr 初识语法分析器生成工具 Antlr

ANTLR v4 权威参考笔记(目录)

在 .NET 应用中使用 ANTLR

ANTLR4入门:在线语法调试塈Maven项目中使用语法调试工具TestRig

ANTLR4入门:在线语法调试塈Maven项目中使用语法调试工具TestRig

Hive 源码解读 Driver 将 HQL 语句转换为 AST