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环境中)
编辑
我不想立即发布,因为我希望你先试一试(是的,我的意思是!);)
这是一个快速演示:
- 将
Java.g
复制到目录中,并@header{...}
删除@header{...}
和@lexer:::header{...}
声明; - 将
antlr-3.3.jar
复制到同一目录中; - 在此目录中创建
Main.java
和Test.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,如下所示: