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