在rpcalc 的 2.1.2 语法规则部分的野牛手册中,写道:
在每个动作中,伪变量 $$ 代表规则将要构建的分组的语义值。为 $$ 赋值是大多数操作的主要工作
这是否意味着$$
用于保存规则的结果?像:
exp exp '+' { $$ = $1 + $2; }
$$
after begin 分配给的典型用法是什么?
在rpcalc 的 2.1.2 语法规则部分的野牛手册中,写道:
在每个动作中,伪变量 $$ 代表规则将要构建的分组的语义值。为 $$ 赋值是大多数操作的主要工作
这是否意味着$$
用于保存规则的结果?像:
exp exp '+' { $$ = $1 + $2; }
$$
after begin 分配给的典型用法是什么?
是的,$$
用于保存规则的结果。在被分配到之后,它通常会成为$x
某个更高级别(或更低优先级)的规则。
考虑(例如)输入,如2 * 3 + 4
. 假设您遵循正常的优先规则,您将执行类似以下操作:{ $$ = $1 * $3; }
. 在这种情况下,这将用于该2 * 3
部分,并且很明显,分配6
给$$
. 然后你就可以{ $$ = $1 + $3; }
处理加法了。对于此操作,$1
将获得您在乘法规则中6
分配的值。$$
这是否意味着
$$
用于保存规则的结果?像:
是的。
$$
after begin 分配给的典型用法是什么?
通常,您将不再需要该值。Bison 在内部使用它来传播价值。在您的示例中,$1
和$2
是两个exp
产生式的各自语义值,也就是说,它们的值是exp
通过设置其 $$
变量在语义规则中的某处设置的。
试试这个。创建一个 YACC 文件:
%token NUMBER
%%
exp: exp '+' NUMBER { $$ = $1 + $3; }
| exp '-' NUMBER { $$ = $1 - $3; }
| NUMBER { $$ = $1; }
;
然后使用 Bison 或 YACC 处理它。我正在使用 Bison,但我认为 YACC 是相同的。然后只需找到“#line”指令。让我们找到“#line 3”指令;它和相关代码将如下所示:
#line 3 "DollarDollar.y"
{ (yyval) = (yyvsp[(1) - (3)]) + (yyvsp[(3) - (3)]); }
break;
然后我们可以很快看到“$$”扩展为“yyval”。其他的东西,比如“yyvsp”,并不那么明显,但至少“yyval”是。
$$ 表示当前表达式求值的结果引用。也就是说,它的结果。因此,它赋值后没有特殊的用法。
再见 !