2

これはPerl の最初のルールにあります:

grammar :   GRAMPROG
            {
              PL_parser->expect = XSTATE;
            }
        remember stmtseq
            {
              newPROG(block_end($3,$4));
              $$ = 0;
            }

右側に要素$4しかない場合、どのように機能しますか?3

4

2 に答える 2

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です。

于 2011-08-23T05:14:15.127 に答える
0

埋め込まれたアクション ({ PL_parser->expect = XSTATE; }ルールの途中で発生するコード) は要素としてカウントされます。なので要素は4つ。$1 は端末のGRAMPROG、 $2 は埋め込みアクション、 $3 は非端末のremember 、 $4 は非端末のstmtseqです。($2 の値は、埋め込まれたアクション内で $$ に割り当てられた値です。現在はガベージです。)

于 2011-07-29T05:03:13.230 に答える