2

我正在使用 ANTLR 创建一种语言,并使用 expr.g 示例开始了一种基础语言。我正在使用 ANTLR 3。我已准备好处理比 int 更多的数据类型,环顾四周后,我在这里找到了 Bart Kiers 的浮点数的精彩示例。

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

这是我的语法文件

和表达式语法部分:

expr returns [int value]
    : e=mexpr {$value = $e.value;}
      ( PLUS e=mexpr {$value += $e.value;}
      | MINUS e=mexpr {$value -= $e.value;}
      )*
    ;

与巴特的比较:

additionExp returns [double value]
    :    m1=multiplyExp       {$value =  $m1.value;} 
         ( '+' m2=multiplyExp {$value += $m2.value;} 
         | '-' m2=multiplyExp {$value -= $m2.value;}
         )* 
    ;

当然,我们的规则正在使用适当的数据类型(对我来说是 int,对他来说是 float)......

4

1 回答 1

1

我真的不认为有必要让规则同时返回 adouble int:如果您需要 a 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;}
         )* 
    ;

在其他规则中,您只需引用规则中的任何一个valueiadditionExp规则中引用,如下所示:

otherRule
 : a=additionExp { 
                   System.out.println("int a.i = " + $a.i);
                   System.out.println("double a.value = " + $a.value);
                 }
 ;
于 2012-10-11T19:31:48.170 回答