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