grammar : GRAMPROG
{
PL_parser->expect = XSTATE;
}
remember stmtseq
{
newPROG(block_end($3,$4));
$$ = 0;
}
如何能當是右側只有3
元素$4
工作?
grammar : GRAMPROG
{
PL_parser->expect = XSTATE;
}
remember stmtseq
{
newPROG(block_end($3,$4));
$$ = 0;
}
如何能當是右側只有3
元素$4
工作?
嵌入式操作(代碼{ PL_parser->expect = XSTATE; }
發生在規則中間)計爲一個元素。所以有4個元素。 $ 1是終端GRAMPROG,$ 2是嵌入式操作,$ 3是非終端記得,而$ 4是非終結者stmtseq。 ($ 2的值是在嵌入式動作中分配給$$的任何值,現在它將是垃圾)。
在封面之下,yacc只在生產結束時才真正支持動作。所以,當你在交織生產,YACC中間的動作{ PL_parser->expect = XSTATE; }
(或任何派生您正在使用)翻出的行動,並在一個空的規則這樣的結尾把它插:
grammar: GRAMPROG $$1 remember stmtmseq
{
newPROG(block_end($3, $4));
$$ = 0;
}
$$1:
{
PL_parser->expect = XSTATE;
}
(如果你的yacc變體支持轉儲詳細語法,你會這樣做,你會看到很多$$ 1,$$ 2等動作規則。)
在這種情況下,交錯操作實際上並沒有給任何東西$$
,但是如果有的話,grammar
規則可能會訪問值爲$2
。