我在ANTLR网站上找到了一个样本模板,它的Javatreeparser.g,该网站说它可以生成我需要的AST,但由于我是ANTLR的新手,我该如何让它显示?到目前为止我所做的是将语法文件与我现有的java语法放在一起。但我不知道如何从文件中使用和输出我需要的AST。我该怎么做?
答案 0 :(得分:8)
我在ANTLR网站上找到了一个样本模板,它的Javatreeparser.g,该网站称其可以产生我需要的AST,
不,组合语法Java.g
from the ANTLR wiki为Java源文件生成词法分析器和解析器。解析器然后构造此源的AST,然后JavaTreeParser.g
可以使用此AST来遍历它。树语法JavaTreeParser.g
不用于创建AST。这是由Java.g
创建的解析器完成的。
到目前为止我所做的是将语法文件与我现有的java语法放在一起。
这是不正确的。树语法JavaTreeParser.g
期望AST作为从Java.g
生成的解析器生成的输入。你不能只插入另一个解析器(或其他树语法)。
但我不知道如何从文件中使用和输出我需要的AST。我该怎么做?
请参阅此前的问与答:Visualizing an AST created with ANTLR (in a .Net environment)
我不想立即发布,因为我希望你先尝试一下(是的,我的意思是!);)
这是一个快速演示:
Java.g
复制到目录中,然后从中删除@header{...}
和@lexer:::header{...}
声明; antlr-3.3.jar
复制到同一目录中; Main.java
和Test.java
(见下文)。public class Test {
int i = 1 + 2;
String s;
Test(String s) {
this.s = s;
}
}
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,从而生成以下图像:
答案 1 :(得分:1)