奇怪的antlr语法规则

时间:2015-10-08 13:57:28

标签: parsing antlr antlr4 antlr3

我找到了一个旧文件来定义像这样的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。

1 个答案:

答案 0 :(得分:1)

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

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

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

1)第47页:

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

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

2)第85页:

规则如下:

rule : alternative1
| alternative2
...
| alternativen
;

其中每个替代产品由一系列元素组成,这些元素可以引用规则,引用标记,操作,谓词和子规则。参数和返回值定义如下所示,其中有n个参数和m个返回值:

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

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

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

这里,各种vi从规则规则接收返回值,每个vi必须是l值。

3)Page 87:

操作的格式为&lt;&lt; ...&gt;&gt;并包含必须在解析期间执行的用户提供的C或C ++代码。