6

在rpcalc 的 2.1.2 语法规则部分的野牛手册中,写道:

在每个动作中,伪变量 $$ 代表规则将要构建的分组的语义值。为 $$ 赋值是大多数操作的主要工作

这是否意味着$$用于保存规则的结果?像:

exp exp '+'   { $$ = $1 + $2;      }

$$after begin 分配给的典型用法是什么?

4

4 回答 4

9

是的,$$用于保存规则的结果。在被分配到之后,它通常会成为$x某个更高级别(或更低优先级)的规则。

考虑(例如)输入,如2 * 3 + 4. 假设您遵循正常的优先规则,您将执行类似以下操作:{ $$ = $1 * $3; }. 在这种情况下,这将用于该2 * 3部分,并且很明显,分配6$$. 然后你就可以{ $$ = $1 + $3; }处理加法了。对于此操作,$1将获得您在乘法规则中6分配的值。$$

于 2012-05-24T14:59:11.803 回答
6

这是否意味着$$用于保存规则的结果?像:

是的。

$$after begin 分配给的典型用法是什么?

通常,您将不再需要该值。Bison 在内部使用它来传播价值。在您的示例中,$1$2是两个exp产生式的各自语义值,也就是说,它们的值是exp通过设置 $$变量在语义规则中的某处设置的。

于 2012-05-24T14:54:21.557 回答
4

试试这个。创建一个 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”是。

于 2017-04-20T04:29:41.453 回答
1

$$ 表示当前表达式求值的结果引用。也就是说,它的结果。因此,它赋值后没有特殊的用法。

再见 !

于 2012-05-24T14:54:54.773 回答