2017-08-11 21 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();では、ツリーオブジェクトはnullになります。 私はantlrに慣れていないので、私がチェックするか何か解決するための提案はありますか?

(さらに情報が必要な場合は、私に通知してください)。

TG。

答えて

2

ルール)。

1

あなたはやってはいけません:電卓の例のように

ParseTree tree = parser.input(); 

?あなたは(その文法を使用していない人にとって、あなたはあなたのトップレベルのパーサを命名何でもしたい

ParseTree tree = parser.compilationUnit(); 

するJavaファイルを解析するための出発点にしたい、あなたは文法hereを使用していると仮定すると、

+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

関連する問題