野牛中的可选参数
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'。如果你想在两个动作之间考虑公共代码,你应该把它写成一个函数,并且让每个动作只是对你的函数的调用。
我正在研究基于 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'。如果你想在两个动作之间考虑公共代码,你应该把它写成一个函数,并且让每个动作只是对你的函数的调用。