2011-07-26 404 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