2017-08-11 43 views
6

Używam antlr v4 do wyodrębniania drzewa parsowania programów java do innych celów. Zacząłem od tej próbki: ANTLR v4 visitor sampleANTLR v4, JavaLexer i JavaParser zwracające wartość NULL jako drzewo parsowania

A ja testowałem czynności na danym łączu, aby sprawdzić czy to działa i wszystko już w porządku:

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

A potem napisałem mój własny do analizowania programów java jako struktura poniżej:

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

a Run.java jest jak poniżej:

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); 
    } 
} 

Ale na oświadczeniu ParseTree tree = parser.getContext(); obiekt drzewa uzyskuje wartość pustą. Jako że jestem nowy w Antlr, wszelkie sugestie do sprawdzenia lub rozwiązania?

(Jeśli potrzebujesz więcej informacji, po prostu powiadom mnie).

TG.

Odpowiedz

2

Zakładając, że używasz gramatykę here, chcesz punkt wyjścia do analizowania pliku Java, aby być

ParseTree tree = parser.compilationUnit(); 

(Dla każdego, nie używając tej gramatyki, chcesz cokolwiek nazwie swoją najwyższego poziomu parsera rule.)

1

nie należy robić:

ParseTree tree = parser.input(); 

jak w przykładzie kalkulatora?

+0

'ParseTree tree = parser.compilationUnit();' byłby punktem wyjścia do parsowania pliku Java. (Zakładając gramatykę Java [tutaj] (https://github.com/antlr/grammars-v4/blob/master/java/Java.g4)) –

+0

@BilltheLizard thanks.make to odpowiedź, więc mogę dać jej +1 –

+0

@ BilltheLizard to prawda. Proszę zaksięguj to jako odpowiedź. Dzięki. – ConductedClever