Bnf 4美元从哪里来?
这是在:Bnf 4美元从哪里来?,bnf,Bnf,这是在: > > 4代码>代码>当只有右边的代码> 3 > /CUL>元素时,一个嵌入的动作(代码 {PLAXSER>>MeX= XSTATE;} /Cube >在规则的中间发生)作为元素来计数。所以有4个元素$1是终端GRAMPROG,$2是嵌入式操作,$3是非终端记住,$4是非终端stmtseq。($ 2的值是在嵌入动作中分配给$$的任何值。当前它将是垃圾。)< /P> < P>一个嵌入的动作(代码 {PLAXSER>>EXCEN= XSTATE;} /Cult>在规则的中间发生)作为一
<> > <代码> > 4代码>代码>当只有右边的代码> 3 > /CUL>元素时,一个嵌入的动作(代码<代码> {PLAXSER>>MeX= XSTATE;} /Cube >在规则的中间发生)作为元素来计数。所以有4个元素$1是终端GRAMPROG,$2是嵌入式操作,$3是非终端记住,$4是非终端stmtseq。($ 2的值是在嵌入动作中分配给$$的任何值。当前它将是垃圾。)< /P> < P>一个嵌入的动作(代码<代码> {PLAXSER>>EXCEN= XSTATE;} /Cult>在规则的中间发生)作为一个元素来计数。所以有4个元素$1是终端GRAMPROG,$2是嵌入式操作,$3是非终端记住,$4是非终端stmtseq。(值$2是嵌入操作中分配给$$的任何值。目前它是垃圾。)在幕后,yacc只支持生产结束时的操作。因此,当在一个产品的中间插入一个动作<代码> {Pr.PysS> Vex= xStand;}时,YACC(或者你使用的任何后代)拉出该动作并将其粘贴在一个空规则的结尾:
grammar: GRAMPROG $$1 remember stmtmseq
{
newPROG(block_end($3, $4));
$$ = 0;
}
$$1:
{
PL_parser->expect = XSTATE;
}
(如果您的yacc变体支持转储详细语法,并且您这样做了,那么您将看到许多$$1、$$2等操作规则。)
在这种情况下,交错操作实际上不会将任何内容分配给
$
,但是如果分配了,语法规则可以访问值作为$2
,yacc实际上只支持生产结束时的操作。因此,当在一个产品的中间插入一个动作<代码> {Pr.PysS> Vex= xStand;}时,YACC(或者你使用的任何后代)拉出该动作并将其粘贴在一个空规则的结尾:
grammar: GRAMPROG $$1 remember stmtmseq
{
newPROG(block_end($3, $4));
$$ = 0;
}
$$1:
{
PL_parser->expect = XSTATE;
}
(如果您的yacc变体支持转储详细语法,并且您这样做了,那么您将看到许多$$1、$$2等操作规则。)
在这种情况下,交错操作实际上并没有将任何内容分配给$
,但如果分配了,则语法
规则可以将该值作为$2
进行访问