【问题标题】:ANTLR Floating Point and Int returns in grammarANTLR 浮点和 Int 以语法形式返回
【发布时间】:2012-10-11 19:10:44
【问题描述】:

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

在他的示例中,他有表达式 return float,然而,这意味着它不返回 int。我对如何让返回规则允许多种返回类型感到困惑?我在想我可以创建一个包含整数和浮点数的组合“数字”类型并返回它,但是当然我遇到了在 Java 中我必须专门返回一个整数或浮点数的问题。我是否必须有两个版本的表达式代码,每个数据类型一个?我认为这不是必需的,但我很难过......我可以想象对表达式使用可选规则(即 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;}
      )*
    ;

与巴特的比较:

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

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

【问题讨论】:

    标签: antlr grammar


    【解决方案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;}
             )* 
        ;
    

    在其他规则中,您只需从 additionExp 规则中引用 valuei,如下所示:

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

    【讨论】:

    • 谢谢 - 我会尝试两种风格(返回多个,或转换为 int)。我仍然不太了解它,但你只有通过实践才能真正学习:)
    • @Sym,我添加了一个如何使用额外属性的小例子。
    • 这是有道理的。谢谢你的例子!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多