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