【问题标题】:What is $$ in bison?野牛中的$$是什么?
【发布时间】:2012-05-24 14:52:05
【问题描述】:

在野牛手册2.1.2 Grammar Rules for rpcalc部分中,写到:

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

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

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

$$在begin分配后的典型用法是什么?

【问题讨论】:

  • +1 为我从确切的谷歌搜索中来到这个页面。
  • 接受的答案是正确的。我测试过了。

标签: c++ parsing bison


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    是的。

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        再见!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-09
          • 1970-01-01
          • 1970-01-01
          • 2013-10-21
          • 2013-03-19
          相关资源
          最近更新 更多