2013-10-20 2 views
11

나는 초보자입니다. 내 코드에서 방문자를 사용하고 그물에 지시를 따르려고했다. 그러나 방문자가 내가 작성한 방법을 입력하지 않는다는 것을 알았습니다. 아무도 내가 잘못한 것을 말해 줄 수 있습니까? 당신이 볼 수 있듯이 방법 "visitProgram"가 입력되었을 때antlr4 방문자를 사용하는 방법

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

} 

, 표준 출력 (11)를 인쇄해야합니다 :

이 내 방문자입니다. 하지만 출력 화면에서 아무 것도주지 못했습니다 (null 유형).

이 내 주요 코드 :

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

이 (부분적으로) 내 문법 파일입니다 : 당신은 당신이 ANTLR4 아이를 방문 할 경우 super 전화를해야

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

답변

8

. 이처럼 : super 또는 후 이전 :

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

당신은 당신의 논리를 어디에 넣을 것인가에 대해 생각해야합니다.

+0

나는 이것이 고대의 쓰레드라는 것을 알고 있지만 이것은 대답으로 표시되어야한다. –