Java 是否有更好的方法检查子节点的类型并相应地返回?
我正在使用ANTLR开发一种小型语言。我已经准备好了一个解释器类,它能够识别和执行这种语言的任何语法树。不幸的是,ANTLR生成解析树。因此,我使用访问者模式将解析树转换为语法树 根据以下规则Java 是否有更好的方法检查子节点的类型并相应地返回?,java,antlr,antlr4,Java,Antlr,Antlr4,我正在使用ANTLR开发一种小型语言。我已经准备好了一个解释器类,它能够识别和执行这种语言的任何语法树。不幸的是,ANTLR生成解析树。因此,我使用访问者模式将解析树转换为语法树 根据以下规则 =| 我的访问者类中的visitFactor(FactorContext ctx)应该返回一个文本或标识符 公开声明访问因子(FactoryContext ctx){ 如果(ctx.ID()!=null) 返回新标识符(ctx.ID().getText()); else if(ctx.literal()!
=|
我的访问者类中的visitFactor(FactorContext ctx)
应该返回一个文本或标识符
公开声明访问因子(FactoryContext ctx){
如果(ctx.ID()!=null)
返回新标识符(ctx.ID().getText());
else if(ctx.literal()!=null)
回访(ctx.literal());
return null;//不应发生,因子*必须*为id或literal。
}
我的问题如下。有没有更好的方法来了解孩子的类型?或者我必须使用if语句,检查每个子项是否为非null?您可以这样使用:
factor
: ID #factorID
| literal #factorLiteral
;
然后将生成以下方法,而不是单个的visitFactor(…)
:
public Statement visitFactorID(factordContext ctx){
返回新标识符(ctx.ID().getText());
}
公开声明访问FactoryTerralContext(FactoryTerralContext ctx){
回访(ctx.literal());
}
根据您的语言,语法结构应该可以不需要单独的AST。请注意,ANTLR4支持直接左递归和优先级(基于备选顺序),因此通常可以定义单个表达式规则,而无需将其拆分为优先级级别,如术语,因子等。例如,如果表达式规则当前看起来像或,您可以像这样重写它,1+2*x+y
的树将像这样(可选标签不会显示在GUI中,但树中的每个表达式实际上都是标签定义的特定子类的实例)。因此,使用解析树作为AST可能会更加合理。谢谢,这非常有用。