ANTLR ParseTree accept()方法有什么作用?

时间:2015-01-18 01:34:48

标签: java antlr visitor-pattern

我正在研究如何使用ANTLR的Tree walker构建一个类型检查器。我看到有一种接受方法。在显示类型检查器实现的示例时,有时在编译器书籍中使用此方法

public Type visit(Plus n) {
if (! (n.e1.accept(this) instanceof IntegerType) )
error.complain("Left side of LessThan must be of type integer");
if (! (n.e2.accept(this) instanceof IntegerType) )
error.complain("Right side of LessThan must be of type integer");
return new IntegerType();
}

这段代码来自Java中的Modern Compiler Implementation。但我真的不明白n.e1.accept(this)的作用。树的每个节点在ANTLR中都有这个方法。

我检查过ANTLR v4文档,解释并不是很清楚;

The ParseTreeVisitor needs a double dispatch method.

有人能解释一下这是做什么的吗?

修改

我研究了一点,这不是一个ANTLR特定的问题,我认为这可以被认为是一个重复的问题所以也许删除它是个好主意:

What is the point of accept() method in Visitor pattern?

1 个答案:

答案 0 :(得分:0)

这是访客模式的内部实现。你可以放心地忽略它。你应该继承YOURGRAMMARBaseVisitor或YOURGRAMMARBaseListener。