Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否有更好的方法检查子节点的类型并相应地返回?_Java_Antlr_Antlr4 - Fatal编程技术网

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

Java 是否有更好的方法检查子节点的类型并相应地返回?,java,antlr,antlr4,Java,Antlr,Antlr4,我正在使用ANTLR开发一种小型语言。我已经准备好了一个解释器类,它能够识别和执行这种语言的任何语法树。不幸的是,ANTLR生成解析树。因此,我使用访问者模式将解析树转换为语法树 根据以下规则 =| 我的访问者类中的visitFactor(FactorContext ctx)应该返回一个文本或标识符 公开声明访问因子(FactoryContext ctx){ 如果(ctx.ID()!=null) 返回新标识符(ctx.ID().getText()); else if(ctx.literal()!

我正在使用ANTLR开发一种小型语言。我已经准备好了一个解释器类,它能够识别和执行这种语言的任何语法树。不幸的是,ANTLR生成解析树。因此,我使用访问者模式将解析树转换为语法树

根据以下规则

=|

我的访问者类中的
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可能会更加合理。谢谢,这非常有用。