【问题标题】:Java Tree parser output for ANTLRANTLR 的 Java 树解析器输出
【发布时间】:2012-04-21 03:18:23
【问题描述】:

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

【问题讨论】:

  • 迈克尔,另请参阅我的编辑

标签: java tree antlr abstract-syntax-tree


【解决方案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:

javac Java*.java

最后,运行 TestRig:

java org.antlr.v4.runtime.misc.TestRig Java compilationUnit -gui Test.java

您将直观地看到 AST,如下所示:

【讨论】:

    【解决方案2】:

    我在 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(见下文)。

    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 生成以下图像:

    【讨论】:

    • @michaelsnowden 不是我所知道的。但也有像 webgraphviz.com 这样的替代品。谷歌肯定有更多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多