[英]Java Tree parser output for ANTLR
我在 ANTLR 網站上找到了一個示例模板,它是 Javatreeparser.g,該網站說它可以生成我需要的 AST,但由於我是 ANTLR 的新手,我該如何讓它顯示? 到目前為止,我所做的是將語法文件與我現有的 java 語法放在一起。 但我不知道如何使用和 output 文件中我需要的 AST。 我該怎么做?
我在 ANTLR 網站上找到了一個示例模板,它是 Javatreeparser.g,該網站說它可以生成我需要的 AST,
不,來自 ANTLR wiki的組合語法Java.g
為 Java 源文件生成詞法分析器和解析器。 然后解析器構造這個源的 AST,然后JavaTreeParser.g
可以使用這個 AST 來遍歷它。 樹語法JavaTreeParser.g
不用於創建 AST。 這是由從Java.g
創建的解析器完成的。
到目前為止,我所做的是將語法文件與我現有的 java 語法放在一起。
那是不正確的。 樹語法JavaTreeParser.g
期望 AST 作為解析器從Java.g
生成的輸入。 您不能只插入另一個解析器(或其他樹語法)。
但我不知道如何使用和 output 文件中我需要的 AST。 我該怎么做?
請參閱之前的問答: Visualizing an AST created with ANTLR (in a.Net environment)
我不想立即發布這個,因為我想讓你先自己試一試(是的,我的意思是;);)
這是一個快速演示:
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;
}
}
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
class 和 pipe output 到一個名為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 ,結果如下圖:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.