我在 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(见下文)。
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 生成以下图像: