parsing - 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
解决方案
您所追求的似乎是给定语言的句子生成。以一段Java代码为例,就是整个Java语言的一句话。然而,由于递归和循环,给定语法的有效句子数量实际上是无限的,即使对于非常基本的语法也是如此。因此,这是一件棘手的事情,我不知道有什么工具可以做到这一点,除了我自己编写的一个工具(作为我的vscode ANTLR4 扩展的一部分),但它仍在开发中。
但是,您可以做的是,通过限制递归和迭代,将生成过程限制为完整语言的一个子集。然而,这里的一个重要方面是:什么是语言的良好表示?
这里的另一点也是:您不能使用从语法生成的句子来测试该语法,因为这总是会成功,因为句子是从该语法生成的,因此必须是有效的。
推荐阅读
- react-native - 我可以在本机反应中找出给定纬度,对数坐标的商店名称吗
- angular - 如何在测试时修复ngrx store throwing错误?
- safari - Hangouts 如何在 Safari 上获取桌面捕获?
- linux - XV6 os - Docker ubuntu 映像错误:“无可启动设备”/qemu-nox 命令
- kotlin - Kotlin 从通用实现中获取运行时类
- c++ - 解析字符串中的双精度和单词
- python - 使用 Django 发送电子邮件报告
- python - 使用pyspark查找每个对应列的两个数据帧上的值差异
- javascript - 如何找出 node/npm 包导出了哪些函数?
- docker - Docker 容器重启后 WebLogic 自动部署的耳朵消失了