【问题标题】:Generating an AST report from Java source code without actually running it从 Java 源代码生成 AST 报告而不实际运行它
【发布时间】:2020-03-08 19:28:46
【问题描述】:

所以我花了一整天的时间试图弄清楚如何使用 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 的信息。不过,原始数据在哪里?

【问题讨论】:

    标签: java antlr antlr4 abstract-syntax-tree


    【解决方案1】:

    我希望你的类路径是正确的。除了 ANTLR 工具jar 之外,它还需要当前目录。所以像.;C:\...\antlr.jar。至于在Java语法上使用ANTLR,可以这样:

    $ antlr4 JavaLexer.g4 JavaParser.g4
    $ javac Java*.java
    $ grun Java compilationUnit -tree -gui
    

    -gui 会弹出一个窗口,这可能需要一些时间。在您向stdin 输入内容后,请记住将EOF 发送到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'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多