首页 > 解决方案 > ANTLR的Visitor系统可以在解析文件时自动访问规则上下文吗?

问题描述

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

标签: parsingantlr4

解决方案


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

快速测试表明:

grammar T;

parse
 : something+ EOF
 ;

something
 : ANY+
 | number
 ;

number
 : DIGITS
 ;

DIGITS
 : [0-9]+
 ;

ANY
 : .
 ;

和一个测试类:

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

推荐阅读