как пользоваться посетителем antlr4
Я новичок в antlr. Я пытался использовать посетителя в своем коде и следуя инструкциям в сети. Однако я узнал, что посетитель не входил в метод, который я создаю вообще. Может кто-нибудь сказать мне, что я сделал не так?
Это мой посетитель:
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 должен печатать 11, когда был введен метод "visitProgram". Но экран вывода ничего мне не дал (нулевой тип).
Это мой основной код:
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());
}
}
}
Это мой файл грамматики (частично):
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)* ;
Ответы
Ответ 1
Вы должны позвонить super
если хотите, чтобы ANTLR4 посещал детей. Как это:
@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;
}
Вы должны подумать о том, где поставить свою логику: до super
или после.