2013-10-20 6 views
11

verwenden Ich bin ein Anfänger von antlr. Ich hatte versucht, Besucher in meinem Code zu verwenden und nach dem Unterricht auf dem Netz. Allerdings fand ich heraus, dass der Besucher nicht eintritt, die Methode, die ich überhaupt schaffen. Kann mir jemand sagen, was ich falsch gemacht habe?wie antlr4 Besucher

Das ist mein Besucher:

import java.util.LinkedList; 
import org.antlr.v4.runtime.misc.NotNull; 

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 

/** 
* 
* @author Sherwood 
*/ 
public class ExtractMicroBaseVisitor extends MicroBaseVisitor<Integer> { 
    //LinkedList<IR> ll = new LinkedList<IR>(); 
    //MicroParser parser; 
    //System.out.println("11"); 

    @Override 
    public Integer visitPgm_body(@NotNull MicroParser.Pgm_bodyContext ctx){ 
     System.out.println(ctx.getText()); 
     return 467; 
    } 

    @Override 
    public Integer visitProgram(@NotNull MicroParser.ProgramContext ctx){ 
     System.out.println("11"); 
     return 456; 
    } 

} 

Wie Sie sehen können, sollte die stdout 11 drucken, wenn die Methode "visitProgram" eingegeben wurde. Aber der Ausgang Bildschirm gab mir nichts (einen Null-Typen).

Das ist mein Hauptcode:

import java.io.IOException; 
import org.antlr.v4.runtime.*; 
import org.antlr.v4.runtime.tree.*; 
/** 
* 
* @author Sherwood 
*/ 
public class Compiler { 

    /** 
    * @param args the command line arguments  
    */ 
    public static void main(String[] args) { 
     // TODO code application logic here 
     //SymbolTable table = new SymbolTable(); 
     try { 
      ANTLRFileStream reader = new ANTLRFileStream("TestCases/step4_testcase3.micro"); 
      MicroLexer lexer = new MicroLexer((CharStream)reader); 
        TokenStream tokens = new CommonTokenStream(lexer); 
        MicroParser parser = new MicroParser(tokens); 
        parser.setErrorHandler(new MyErrorStrategy()); 
        ParseTree tree = parser.program(); 

        //ParseTreeWalker walker = new ParseTreeWalker(); // create standard walker 
        //ExtractMicroBaseListener extractor = new ExtractMicroBaseListener(parser); 
        //walker.walk(extractor, tree); // initiate walk of tree with listener 
        ExtractMicroBaseVisitor visitor = new ExtractMicroBaseVisitor(); 
        int t = visitor.visit(tree); 
        //for(String str : extractor.table.checkDuplicate()){ 
        // System.out.println("SHADOW WARNING " + str); 
        //} 
        //System.out.println(extractor.table.checkDuplicate().toString()); 
        //System.out.println(extractor.table.toString()); 
        //System.out.println("Accepted"); 
    }catch (IOException e) { 
       System.out.println("Not Accepted"); 
      }catch(IllegalArgumentException e){ 
       System.out.println(e.getMessage()); 
      } 
    } 
} 

Dies ist meine Grammatikdatei (teilweise):

grammar Micro; 

options { 
    language = Java; 
} 

//Program 
program   : ('PROGRAM' id 'BEGIN' pgm_body 'END') 
; 

id    : IDENTIFIER; 
pgm_body   : (decl func_declarations); 
decl   : (string_decl_list | var_decl_list)* ; 

Antwort

8

Sie haben super anrufen, wenn Sie ANTLR4 Kinder besuchen möchten. Wie folgt aus:

@Override 
public Integer visitPgm_body(@NotNull MicroParser.Pgm_bodyContext ctx){ 
    super.visitPgm_body(ctx); 
    System.out.println(ctx.getText()); 
    return 467; 
} 

@Override 
public Integer visitProgram(@NotNull MicroParser.ProgramContext ctx){ 
    super.visitProgram(ctx); 
    System.out.println("11"); 
    return 456; 
} 

haben Sie darüber nachdenken, wo Sie Ihre Logik setzen: vor super oder danach.

+0

Ich weiß, dass dies ein alter Thread, aber dies sollte als Antwort markiert werden. –