title: how to use antlr4 visitor
body: <p>I am a beginner of antlr. I was trying to use visitor in my code and following the instruction on the net. However, I found out that the visitor was not entering the method I create at all. May anyone tell me what I did wrong?</p>
  
  <p>This is my visitor:</p>
  
  <pre><code>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&lt;Integer&gt; {
      //LinkedList&lt;IR&gt; ll = new LinkedList&lt;IR&gt;();
      //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;
      }
  
  }
  </code></pre>
  
  <p>As you can see, the stdout should print 11 when the method "visitProgram" was entered. But the output screen gave me nothing (a null type).</p>
  
  <p>This is my main code:</p>
  
  <pre><code>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());
              }
      }
  }
  </code></pre>
  
  <p>This is my grammar file(partially):</p>
  
  <pre><code>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)* ;
  </code></pre>