java - 从 Java 源代码生成 AST 报告而不实际运行它

标签 java antlr antlr4 abstract-syntax-tree

所以我花了一整天的时间试图弄清楚如何使用 ANTLR。我有一堆 Java 源代码文件。我的目标是使用 ANTLR 为每个文件创建一个 AST。最后,AST 将转换为 JSON,因此使用 Python 等动态语言解析它们将更容易。转换将使用此topic中的解决方案(尽管如果有人有更好的解决方案,我会很高兴听到)。我已经成功运行 getting-started 中的基本示例页。现在我正在尝试弄清楚如何为我的 Java 源代码文件之一创建 AST。正如 getting-started 中所说页面,我可以使用 Java grammar为了那个原因。我已经下载了 JavaParser.g4JavaLexer.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,我什至不确定应该将其包含在命令中的何处。 所以我的问题是:

  1. 如何为文件 /tmp/file.java 创建 AST?
  2. 是否可以在不实际编写 Java 代码的情况下创建 AST 文件?我看到很多地方都建议编写 Java 代码并使用 Maven 或其他工具进行编译。如果可能的话,我宁愿不这样做,而是使用命令行选项。
  3. 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/

相关文章:

java - 将对象作为 "root"放入 VelocityContext

ANTLR:如果后面有某个字符则不匹配

java - ANTLR 错误 134

java - JDBC如何在自增字段中插入记录

java - 线程转储分析工具/方法

java - 找不到所需的符号方法()javax.xml.bind.annotation.XmlElementRef

c# - 可视化使用 ANTLR 创建的 AST(在 .Net 环境中)

java - ANTLR4 中的树语法在哪里?

java - 在监听器中使用 ParserRuleContext 遍历 token - ANTLR4

c# - 停止访问的推荐方法是什么?