ANTLR的Java Tree解析器输出

时间:2012-04-08 08:44:47

标签: java tree antlr abstract-syntax-tree

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

2 个答案:

答案 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)

修改

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

这是一个快速演示:

  1. Java.g复制到目录中,然后从中删除@header{...}@lexer:::header{...}声明;
  2. antlr-3.3.jar复制到同一目录中;
  3. 在此目录中创建文件Main.javaTest.java(见下文)。
  4. 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,从而生成以下图像:

    enter image description here

答案 1 :(得分:1)

我真的建议你使用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,如下所示:

enter image description here