解析文件时,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
我已经使用 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