mar*_*ike 4 java tree antlr abstract-syntax-tree
我在ANTLR网站上找到了一个样本模板,它的Javatreeparser.g,该网站说它可以产生我需要的AST,但由于我是ANTLR的新手,我该如何让它显示?到目前为止我所做的是将语法文件与我现有的java语法放在一起.但我不知道如何从文件中使用和输出我需要的AST.我该怎么做?
我在ANTLR网站上找到了一个样本模板,它的Javatreeparser.g,该网站说它可以产生我需要的AST,
不,Java.g 来自ANTLR wiki的组合语法为Java源文件生成词法分析器和解析器.解析器然后构造此源的AST,然后可以使用此AST JavaTreeParser.g来遍历它.树语法JavaTreeParser.g是不用于创建AST.这是由创建的解析器完成的Java.g.
到目前为止我所做的是将语法文件与我现有的java语法放在一起.
那是不对的.树语法JavaTreeParser.g要求AST作为解析器生成的输入Java.g.你不能只插入另一个解析器(或其他树语法).
但我不知道如何从文件中使用和输出我需要的AST.我该怎么做?
请参阅此前的问答:可视化使用ANTLR创建的AST(在.Net环境中)
我不想立即发布,因为我希望你先尝试一下(是的,我的意思是!);)
这是一个快速演示:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
现在生成一个词法分析器和解析器:
java -cp antlr-3.3.jar org.antlr.Tool Java.g
Run Code Online (Sandbox Code Playgroud)
然后编译所有.java源文件:
javac -cp antlr-3.3.jar *.java
Run Code Online (Sandbox Code Playgroud)
最后运行Main类并将输出传递给一个名为的文件ast.dot.
java -cp .:antlr-3.3.jar Main > ast.dot
Run Code Online (Sandbox Code Playgroud)
(在Windows上,做的:java -cp .;antlr-3.3.jar Main > ast.dot)
如果现在打开文件ast.dot,则会看到解析器生成的AST 的DOT表示.您可以通过在此处复制粘贴DOT源来可视化此AST:http://graphviz-dev.appspot.com,得到以下图像:
