ANTLR的Java Tree解析器输出

我在ANTLR网站上找到了一个样本模板,它的Javatreeparser.g,该网站说它可以生成我需要的AST,但由于我是ANTLR的新手,我该如何让它显示? 到目前为止我所做的是将语法文件与我现有的java语法放在一起。 但我不知道如何使用和输出我需要的文件AST。 我该怎么做?

我在ANTLR网站上找到了一个样本模板,它的Javatreeparser.g,该网站说它可以产生我需要的AST,

不, 来自ANTLR wiki的组合语法Java.g为Java源文件生成词法分析器和解析器。 解析器然后构造此源的AST,然后JavaTreeParser.g可以使用此AST来遍历它。 树语法JavaTreeParser.g 用于创建AST。 这是由Java.g创建的解析器完成的。

到目前为止我所做的是将语法文件与我现有的java语法放在一起。

那是不对的。 树语法JavaTreeParser.g期望AST作为从Java.g生成的解析器生成的输入。 您不能只插入另一个解析器(或其他树语法)。

但我不知道如何使用和输出我需要的文件AST。 我该怎么做?

请参阅此前的问答: 可视化使用ANTLR创建的AST(在.Net环境中)

编辑

我不想立即发布,因为我希望你先试一试(是的,我的意思是!);)

这是一个快速演示:

  1. Java.g复制到目录中,并@header{...}删除@header{...}@lexer:::header{...}声明;
  2. antlr-3.3.jar复制到同一目录中;
  3. 在此目录中创建Main.javaTest.java文件(见下文)。

Test.java

 public class Test { int i = 1 + 2; String s; Test(String s) { this.s = s; } } 

Main.java

 import org.antlr.runtime.*; import org.antlr.runtime.tree.*; import org.antlr.stringtemplate.*; public class Main { public static void main(String[] args) throws Exception { JavaLexer lexer = new JavaLexer(new ANTLRFileStream("Test.java")); JavaParser parser = new JavaParser(new CommonTokenStream(lexer)); CommonTree tree = (CommonTree)parser.javaSource().getTree(); DOTTreeGenerator gen = new DOTTreeGenerator(); StringTemplate st = gen.toDOT(tree); System.out.println(st); } } 

现在生成一个词法分析器和解析器:

 java -cp antlr-3.3.jar org.antlr.Tool Java.g 

然后编译所有.java源文件:

 javac -cp antlr-3.3.jar *.java 

最后运行Main类并将输出传递给名为ast.dot的文件。

 java -cp .:antlr-3.3.jar Main > ast.dot 

(在Windows上,执行: java -cp .;antlr-3.3.jar Main > ast.dot

如果现在打开文件ast.dot ,您会看到解析器生成的AST的DOT表示。 您可以通过在此处复制粘贴DOT源来可视化此AST: http : //graphviz-dev.appspot.com,得到以下图像:

在此处输入图像描述

我真的建议你使用antlr4。

首先,设置CLASSPATH(包括antlr-4.5.3-complete.jar)和JAVA_HOME。

其次,从语法Java.g4生成词法分析器和解析器:

 java -cp antlr-4.5.2-complete.jar Java.g4 

三,编译所有Java * .java genereated:

 javac Java*.java 

最后,运行TestRig:

 java org.antlr.v4.runtime.misc.TestRig Java compilationUnit -gui Test.java 

您将在视觉上看到AST,如下所示:

在此处输入图像描述