野牛中的可选参数

optional parameters in bison

我正在研究基于 gnbasic 的 flex/bison 中的 BASIC 解释器。我在.y中发现了一个小问题,bison抱怨这段代码:

NEXT variable | NEXT {
    statement_t *new = mkstatement(NEXT);
    if (strlen() > 0) {
        new->parms.next = ;
    }
  $$ = new;
}

错误integer out of range: ‘’。我很快就能够确定这是因为两种形式中的第二种形式 NEXT 没有变量,没有 </code>。所以很简单,把这个分开:</p> <pre><code>NEXT { statement_t *new = mkstatement(NEXT); $$ = new; }

但这是正确的解决方案吗?有什么办法可以让这两者结合起来并处理可选参数吗?我怀疑这在大多数语言中并不少见,而且我缺少正确的术语来询问 Google.

您的原始代码相当于:

  NEXT variable { $$ = ; }
| NEXT {
      statement_t *new = mkstatement(NEXT);
      if (strlen() > 0) {
          new->parms.next = ;
      }
      $$ = new;
  }

-- 每个规则都有自己的动作;在为与 | 相同的非终结符定义的规则之间,它们在任何方面都不 'shared'。如果你想在两个动作之间考虑公共代码,你应该把它写成一个函数,并且让每个动作只是对你的函数的调用。