ANTLR的Java Tree解析器输出

mar*_*ike 4 java tree antlr abstract-syntax-tree

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

Bar*_*ers 8

我在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环境中)

编辑

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

这是一个快速演示:

  1. 复制Java.g目录并从中删除@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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
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,得到以下图像:

在此输入图像描述