我正在使用ANTLR创建一种语言,并使用expr.g示例启动了一种基本语言。我正在使用ANTLR 3.我准备处理比int更多的数据类型,在环顾四周之后,我找到了Bart Kiers的漂浮物的精彩示例,here。
在他的例子中,他有表达式return float,但是,这意味着它不返回int。我很困惑如何让一个返回规则允许多个返回类型?我当时认为我可以制作一个合并的“数字”类型,它包含整数和浮点数并返回它,但当然我遇到的问题是在Java中我必须特别返回一个int或一个浮点数。我是否必须有两个版本的表达式代码,每种数据类型一个?我认为这不是必要的,但我感到难过......我可以想象使用表达式的可选规则(即float或int在此表达式中有效),但返回类型本身需要特定类型。我很抱歉重复自己,但我很清楚我对此感到困惑。
表达式语法部分:
expr returns [int value]
: e=mexpr {$value = $e.value;}
( PLUS e=mexpr {$value += $e.value;}
| MINUS e=mexpr {$value -= $e.value;}
)*
;
与Bart的比较:
additionExp returns [double value]
: m1=multiplyExp {$value = $m1.value;}
( '+' m2=multiplyExp {$value += $m2.value;}
| '-' m2=multiplyExp {$value -= $m2.value;}
)*
;
当然我们的规则是使用适当的数据类型(int为我,浮动为他)...
答案 0 :(得分:1)
我真的不认为有必要让规则同时返回double
和 int
:如果您需要int
,只需转换double
。
也就是说,ANTLR规则可以返回多个对象(或原语):
additionExp returns [double value, int i]
您可以在倾斜代码{ ... }
中设置,就像$value
一样,或者在@after{ ... }
块中设置:
additionExp returns [double value, int i]
@after{ $i = (int)$value; }
: m1=multiplyExp {$value = $m1.value;}
( '+' m2=multiplyExp {$value += $m2.value;}
| '-' m2=multiplyExp {$value -= $m2.value;}
)*
;
在其他规则中,您只需引用value
规则中的i
或additionExp
,如下所示:
otherRule
: a=additionExp {
System.out.println("int a.i = " + $a.i);
System.out.println("double a.value = " + $a.value);
}
;