解析文件时,ANTLR 的访问者系统能否自动访问规则上下文?

Can ANTLR's Visitor system automatically visit a rule context when a file is parsed?

我已经使用 ANTLR 一个月了,但我仍然不是专家。我想知道生成的 ANTLR BaseVisitor class 是否会在 visitRuleContext() 实现并且要解析的文件完成后自动访问特定的规则上下文。

是的,如果您查看生成的访问者 class,您会看到所有方法 return visitChildren(ctx)。因此,当您只在自己的访问者中覆盖一个 visit...(...) 方法时,将调用您的单一方法。

快速测试表明:

grammar T;

parse
 : something+ EOF
 ;

something
 : ANY+
 | number
 ;

number
 : DIGITS
 ;

DIGITS
 : [0-9]+
 ;

ANY
 : .
 ;

还有一个测试class:

public class Main {
  public static void main(String[] args) throws Exception {
    TLexer lexer = new TLexer(CharStreams.fromString("mu 123"));
    TParser parser = new TParser(new CommonTokenStream(lexer));
    ParseTree root = parser.parse();
    new TestVisitor().visit(root);
  }
}

class TestVisitor extends TBaseVisitor<Object> {
  @Override
  public Object visitSomething(TParser.SomethingContext ctx) {
    System.out.println("visitSomething: " + ctx.getText());
    return super.visitChildren(ctx);
  }
}

将打印:

visitSomething: mu 
visitSomething: 123