是否有更好的方法来检查子节点的类型并相应地返回?

问题描述 投票:0回答:1

我正在使用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?

java antlr antlr4
1个回答
0
投票

您可以这样使用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());
}
© www.soinside.com 2019 - 2024. All rights reserved.