在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”是。
$$ 表示当前表达式求值的结果引用。也就是说,它的结果。因此,它赋值后没有特殊的用法。
再见 !