ANTLR浮点和Int以语法返回

时间:2012-10-11 19:10:45

标签: antlr grammar

我正在使用ANTLR创建一种语言,并使用expr.g示例启动了一种基本语言。我正在使用ANTLR 3.我准备处理比int更多的数据类型,在环顾四周之后,我找到了Bart Kiers的漂浮物的精彩示例,here

在他的例子中,他有表达式return float,但是,这意味着它不返回int。我很困惑如何让一个返回规则允许多个返回类型?我当时认为我可以制作一个合并的“数字”类型,它包含整数和浮点数并返回它,但当然我遇到的问题是在Java中我必须特别返回一个int或一个浮点数。我是否必须有两个版本的表达式代码,每种数据类型一个?我认为这不是必要的,但我感到难过......我可以想象使用表达式的可选规则(即float或int在此表达式中有效),但返回类型本身需要特定类型。我很抱歉重复自己,但我很清楚我对此感到困惑。

Here is my grammar file

表达式语法部分:

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为我,浮动为他)...

1 个答案:

答案 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规则中的iadditionExp,如下所示:

otherRule
 : a=additionExp { 
                   System.out.println("int a.i = " + $a.i);
                   System.out.println("double a.value = " + $a.value);
                 }
 ;