2013-10-20 22 views
11

Ben bir antlr başlangıçlıyım. Ziyaretçiyi kodumda kullanmaya ve ağdaki talimatları izlemeye çalışıyordum. Ancak, ziyaretçinin benim oluşturduğum yönteme girmediğini öğrendim. Herkes bana yanlış yaptıklarımı söyleyebilir mi? Gördüğünüz gibi yöntem "visitProgram" girildiği zamanantlr4 ziyaretçi kullanımı nasıl

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

} 

, stdout'u 11 basmalı:

Bu benim ziyaretçi olduğunu. Ama çıktı ekranı bana hiçbir şey vermedi (boş tip).

Bu benim ana kodudur:

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

Bu (kısmen) benim dilbilgisi dosyasıdır: Sen ANTLR4 çocukları ziyaret etmek istiyorum super aramak zorunda

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

cevap

8

. Şunun gibi: super veya sonrasında önce:

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

Sen mantığı nereye hakkında düşünmek zorunda.

+0

Bunun eski bir konu olduğunu biliyorum, ancak bu yanıt olarak işaretlenmelidir. –