所以我花了一整天的时间试图弄清楚如何使用 ANTLR。我有一堆 Java 源代码文件。我的目标是使用 ANTLR 为每个文件创建一个 AST。最后,AST 将转换为 JSON,因此使用 Python 等动态语言解析它们将更容易。转换将使用此topic中的解决方案(尽管如果有人有更好的解决方案,我会很高兴听到)。我已经成功运行 getting-started 中的基本示例页。现在我正在尝试弄清楚如何为我的 Java 源代码文件之一创建 AST。正如 getting-started 中所说页面,我可以使用 Java grammar为了那个原因。我已经下载了 JavaParser.g4
和 JavaLexer.g4
。我尝试运行:
java -Xmx500M -cp "/p/antlr-4.8-complete.jar:$CLASSPATH" org.antlr.v4.Tool JavaParser.g4
但我收到错误:
JavaParser.g4:32:21: cannot find tokens file ./JavaLexer.tokens
我想我需要以某种方式创建该文件,但我无法从文档中理解如何创建该文件。所以我尝试在 Github 中找到该文件,结果发现 here 。我已经下载了,看起来不错:
java -Xmx500M -cp "/p/antlr-4.8-complete.jar:$CLASSPATH" org.antlr.v4.Tool JavaParser.g4
javac JavaP*.java // Also tried javac Java*.java
java -Xmx500M -cp "/p/antlr-4.8-complete.jar:$CLASSPATH" org.antlr.v4.gui.TestRig JavaParser r -gui
但我得到:
Exception in thread "main" java.lang.ClassCastException: class JavaParser
at java.lang.Class.asSubclass(Class.java:3404)
at org.antlr.v4.gui.TestRig.process(TestRig.java:135)
at org.antlr.v4.gui.TestRig.main(TestRig.java:119)
不确定我做错了什么,或者我是否在做正确的事情来解决我的问题。
我想做的就是创建文件 /tmp/file.java
的 AST,我什至不确定应该将其包含在命令中的何处。
所以我的问题是:
- 如何为文件
/tmp/file.java
创建 AST? - 是否可以在不实际编写 Java 代码的情况下创建 AST 文件?我看到很多地方都建议编写 Java 代码并使用 Maven 或其他工具进行编译。如果可能的话,我宁愿不这样做,而是使用命令行选项。
- JSON 主题(上面提到的)更新已经有一段时间了。有什么改变吗?是否可以在不实际运行 Java 的情况下创建 JSON 报告?
正如你所看到的,我真的很困惑,所以我感谢任何帮助!
编辑:一个小说明 - 我不需要 AST 图像,而是创建 JSON 报告。如果没有简单的方法来做到这一点,我确信 ANTLR 有一些包含该信息的原始文件,我可以解析这些信息并将其转换为 JSON。不过,原始数据位于哪里?
最佳答案
我希望你的类路径是正确的。除了 ANTLR 工具 jar
之外,它还需要当前目录。所以类似于 .;C:\...\antlr.jar
。至于在Java语法上使用ANTLR,可以这样做:
$ antlr4 JavaLexer.g4 JavaParser.g4
$ javac Java*.java
$ grun Java compilationUnit -tree -gui
-gui
将弹出一个窗口,这可能需要一些时间。请记住在向 stdin
键入内容后向 ANTLR 运行时发送 EOF
。 (Windows 上为 CTLR+Z,Linux 上为 CTLR+D)或者,您可以输入一个文件作为 grun
的额外参数。
从两个 .g4
文件中,我无法判断语法名称是 Java
。我只是根据上下文猜出来的。 compilationUnit
是所有 java 文件开头的第一个语法规则的名称。这可以通过打开 JavaParser.g4
并阅读第一条规则来推断。
这是我在 Git Bash 上使用的别名。
$ alias
alias antlr4='java -Xmx500M org.antlr.v4.Tool'
alias grun='java -Xmx500M org.antlr.v4.gui.TestRig'
关于java - 从 Java 源代码生成 AST 报告而不实际运行它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60591260/