これはthe first rule of Perlである:
grammar : GRAMPROG
{
PL_parser->expect = XSTATE;
}
remember stmtseq
{
newPROG(block_end($3,$4));
$$ = 0;
}
どのように右側のみ3
の要素をそこにいる$4
仕事ができますか?
これはthe first rule of Perlである:
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
という値にアクセスできました。