2013-10-20 14 views
11

Tôi là người mới bắt đầu sử dụng antlr. Tôi đã cố gắng sử dụng khách truy cập trong mã của tôi và làm theo hướng dẫn trên mạng. Tuy nhiên, tôi phát hiện ra rằng khách truy cập không đi vào phương pháp mà tôi tạo ra. Có ai nói cho tôi biết tôi đã làm gì sai không?cách sử dụng khách truy cập antlr4

Đây là khách truy cập của tôi:

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

} 

Như bạn có thể thấy, các thiết bị xuất chuẩn nên in 11 khi các phương pháp "visitProgram" đã được nhập. Nhưng màn hình đầu ra đã cho tôi không có gì (một loại null).

Đây là mã chính của tôi:

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

Đây là tập ngữ pháp của tôi (một phần):

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

Trả lời

8

Bạn phải gọi super nếu bạn muốn ANTLR4 đến thăm trẻ em. Như thế này:

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

Bạn phải suy nghĩ về vị trí đặt logic của mình: trước super hoặc sau đó.

+0

Tôi biết đây là một chủ đề cổ, nhưng điều này sẽ được đánh dấu là câu trả lời. –

Các vấn đề liên quan