这是Perl 的第一条规则:
grammar : GRAMPROG
{
PL_parser->expect = XSTATE;
}
remember stmtseq
{
newPROG(block_end($3,$4));
$$ = 0;
}
当右侧$4
只有元素时如何工作?3
这是Perl 的第一条规则:
grammar : GRAMPROG
{
PL_parser->expect = XSTATE;
}
remember stmtseq
{
newPROG(block_end($3,$4));
$$ = 0;
}
当右侧$4
只有元素时如何工作?3
在幕后,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
。
嵌入的动作({ PL_parser->expect = XSTATE; }
出现在规则中间的代码)算作一个元素。所以有4个元素。$1 是终结符GRAMPROG,$2 是嵌入式动作,$3 是非终结符remember,$4 是非终结符stmtseq。($2 的值是在嵌入式操作中分配给 $$ 的任何值。目前它会是垃圾。)