奇怪的鹿角语法规则



我找到了一个旧文件,它定义了像这样的antlr语法规则:

rule_name[ ParamType *param ] > [ReturnType *retval]:
  <<
    $retval                    = NULL;
    OtherType1  *new_var1      = NULL;
    OtherType2    *new_var2    = NULL;
  >>
  subrule1[ param ] > [ $retval ]
| subrule2 > [new_var2] 
  <<
    if( new_var2 == SOMETHING ){
      $retval = something_related_to_new_var2;
    }
    else{
      $retval = new_var2;
    }
  >>
  { 
    somethingelse > [new_var_1]
    <<
      /* Do something with new_var_1 */
      $retval = new_var_1;
    >>
  }
;

我不是Antlr专家,这是我第一次看到这种规则定义的语义。有人知道我在哪里可以找到关于这个的文档/信息吗?即使是谷歌搜索的关键字也是受欢迎的。

编辑:应该是ANTLR版本1.33MR33

好的,我找到了!以下是指南:

http://www.antlr2.org/book/pcctsbk.pdf

我引用pdf中回答我问题的有趣部分。

1) Page 47:

poly > [float r]
: <<float f;>>
term>[$r] ( "+" term>[f] <<$r += f;>> )*
;

规则多边形被定义为通过"> [float r]"符号有一个名为$r的返回值;这类似于UNIX shell的输出重定向字符。设置$r的值将设置poly的返回值。":"之后的第一个动作是初始动作(因为它是规则或子规则的第一个动作)。init-action定义了一个名为f的局部变量,它将在(…)*循环中用于保存术语的返回值。

2) Page 85:

规则看起来像:

rule : alternative1
| alternative2
...
| alternativen
;

,其中每个可选产品都由一个元素列表组成,这些元素可以是对规则的引用、对令牌、操作、谓词和子规则的引用。参数和返回值定义如下所示,其中有n个参数和m个返回值:

rule[arg1,...,argn] > [retval1,...,retvalm] : ... ;

使用规则的语法反映了规则的定义:

a : ... rule[arg1,...,argn] > [v1,...,vm] ...
;

这里,各个vi接收来自规则规则的返回值,每个vi必须是一个l值。

3)第87页:

动作的形式为<<…>>并包含在解析期间必须执行的用户提供的C或c++代码。

相关内容

  • 没有找到相关文章

最新更新