我正在使用ANTLR开发一种小语言。我已经准备好一个解释器类,它能够识别和执行该语言的任何语法树。不幸的是,ANTLR产生了解析树。因此,我正在使用访客模式将解析树转换为语法树。
给出以下规则,
<Factor> = <Identifier> | <Literal>
我的访问者类中的visitFactor(FactorContext ctx)
,应返回文字或标识符...。
public Statement visitFactor(FactorContext ctx) {
if (ctx.ID() != null)
return new Identifier(ctx.ID().getText());
else if (ctx.literal() != null)
return visit(ctx.literal());
return null; // should never happen, factor *must* be either id or literal.
}
我的问题如下。有没有更好的方法来了解Factor的孩子的类型?还是我必须使用if语句来检查每个孩子是否非null?
您可以这样使用alternative labels:
factor
: ID #factorID
| literal #factorLiteral
;
然后将产生以下方法,而不是单个visitFactor(...)
:
public Statement visitFactorID(FactorIDContext ctx) {
return new Identifier(ctx.ID().getText());
}
public Statement visitFactorLiteral(FactorLiteralContext ctx) {
return visit(ctx.literal());
}