2017-08-11 102 views
6

我正在使用antlr v4爲其他目的提取Java程序的分析樹。我從這個樣本開始:ANTLR v4 visitor sampleANTLR v4,JavaLexer和JavaParser作爲解析樹返回null

而且我已經測試給定鏈路上的步驟檢查是否正常工作,一切都消失了右:

java Run 
a = 1+2 
b = a^2 
c = a+b*(a-1) 
a+b+c 
^Z 
Result: 33.0 

然後我寫我自己來解析Java程序的結構如下:

|_Java.g4                
|_Java.tokens               
|_JavaBaseVisitor.java             
|_JavaLexer.java               
|_JavaLexer.tokens              
|_JavaParser.java              
|_JavaTreeExtractorVisitor.java           
|_JavaVisitor.java   
|_Run.java 

而且Run.java是如下:

import org.antlr.v4.runtime.*; 
import org.antlr.v4.runtime.tree.*; 

public class Run { 
    public static void main(String[] args) throws Exception { 
     CharStream input = CharStreams.fromFileName("F:\\Projects\\Java\\Netbeans\\ASTProj\\JavaTreeExtractor\\prog.java"); 
     JavaLexer lexer = new JavaLexer(input); 
     CommonTokenStream tokens = new CommonTokenStream(lexer); 
     JavaParser parser = new JavaParser(tokens); 
     ParseTree tree = parser.getContext(); 

     JavaTreeExtractorVisitor calcVisitor = new JavaTreeExtractorVisitor(); 
     String result = calcVisitor.visit(tree); 
     System.out.println("Result: " + result); 
    } 
} 

但在語句ParseTree tree = parser.getContext();上,樹對象爲空。 由於我是antlr的新手,有任何建議讓我檢查或解決?

(如果需要更多信息,只需通知我)。

TG。

回答

2

假設你正在使用的語法here,你要解析Java文件的出發點是

ParseTree tree = parser.compilationUnit(); 

(對於任何不使用的語法,任何你想要的,你命名你的頂級解析器規則)。

1

你不是應該做的:

ParseTree tree = parser.input(); 

如計算器的例子嗎?

+0

'ParseTree tree = parser.compilationUnit();'將是解析Java文件的起點。 (假設Java語法[這裏](https://github.com/antlr/grammars-v4/blob/master/java/Java.g4)) –

+0

@BilltheLizard thanks.make答案,所以我可以+1它 –

+0

@BilltheLizard沒錯。請張貼這個答案。謝謝。 – ConductedClever