从Java源代码生成AST报告,而没有实际运行它

问题描述 投票:0回答:1

因此,我整天都在努力弄清楚如何使用ANTLR。我有一堆Java源代码文件。我的目标是使用ANTLR为每个文件创建一个AST。最后,AST将转换为JSON,因此使用诸如python这样的动态语言来解析每个AST会更加容易。转换将使用此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文件?在很多地方,他们建议使用Maven或其他工具编写Java代码并进行编译。如果可能的话,我宁愿不这样做,而是使用命令行选项。
  3. 自从JSON主题(上述)更新以来已经有一段时间了。有什么改变吗?是否可以在不实际运行Java的情况下创建JSON报告?

如您所见,我真的很困惑,非常感谢您的帮助!

EDIT:简要说明-我不需要AST图像,而是创建JSON报告。如果没有简便的方法,我可以确定ANTLR有一些原始文件,其中包含我可以解析并将其转换为JSON的信息。虽然,原始数据在哪里?

java antlr antlr4 abstract-syntax-tree
1个回答
0
投票
$ antlr4 JavaLexer.g4 JavaParser.g4 $ javac Java*.java $ grun Java compilationUnit -tree -gui

-gui将弹出一个窗口,可能需要一些时间。在EOF中键入内容后,请记住将stdin发送到ANTLR运行时。 (在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'

© www.soinside.com 2019 - 2024. All rights reserved.