2011-07-26 14 views
2

これはthe first rule of Perlである:

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

どのように右側のみ3の要素をそこにいる$4仕事ができますか?

答えて

0

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

0

実際、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という値にアクセスできました。

関連する問題