什么是北美野牛?

时间:2012-05-24 14:52:06

标签: c++ parsing bison

2.1.2 Grammar Rules for rpcalc部分的野牛手册中,写有:

  

在每个动作中,伪变量$$代表语义值   对于规则要构建的分组。分配一个   value to $$是大多数行动的主要工作

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

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

开始分配给$$之后的典型用法是什么?

4 个答案:

答案 0 :(得分:5)

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

考虑(例如)像2 * 3 + 4这样的输入。假设您遵循正常的优先级规则,您将执行类似以下操作:{ $$ = $1 * $3; }。在这种情况下,这将用于2 * 3部分,显然,将6分配给$$。然后你有{ $$ = $1 + $3; }来处理添加。对于此操作,$1将被赋予您在乘法规则中分配给6的值$$

答案 1 :(得分:4)

  

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

  

开始分配给$$之后,$1的典型用法是什么?

通常,您不再需要该值。 Bison在内部使用它来传播价值。在您的示例中,$2exp是两个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)

$$表示当前表达式评估的结果引用。换句话说,它的结果。因此,在分配之后没有特别的用法。

再见!