grammar : GRAMPROG
{
PL_parser->expect = XSTATE;
}
remember stmtseq
{
newPROG(block_end($3,$4));
$$ = 0;
}
如果右侧只有$4
元素,3
如何工作?
答案 0 :(得分:0)
嵌入式操作(发生在规则中间的代码{ PL_parser->expect = XSTATE; }
)计为一个元素。所以有4个元素。 $ 1是终端 GRAMPROG ,$ 2是嵌入式操作,$ 3是非终结记住,$ 4是非终结 stmtseq 。 ($ 2的值是嵌入式操作中分配给$$的任何值。目前它将是垃圾。)
答案 1 :(得分:0)
在封面下,yacc只支持生产结束时的操作。因此,当你在一个制作过程中交错一个动作{ PL_parser->expect = XSTATE; }
时,yacc(或者你正在使用的任何后代)会拉出动作并将其粘贴在空规则的末尾,如下所示:
grammar: GRAMPROG $$1 remember stmtmseq
{
newPROG(block_end($3, $4));
$$ = 0;
}
$$1:
{
PL_parser->expect = XSTATE;
}
(如果您的yacc变体支持转储详细语法并且您这样做,您将看到很多针对操作的$$ 1,$ 2等规则。)
在这种情况下,交错操作实际上并未向$$
分配任何内容,但如果有,则grammar
规则可以访问$2
的值。