4美元来自哪里?

时间:2011-07-26 03:39:33

标签: bnf

这是the first rule of Perl

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

如果右侧只有$4元素,3如何工作?

2 个答案:

答案 0 :(得分:0)

嵌入式操作(发生在规则中间的代码{ PL_parser->expect = XSTATE; })计为一个元素。所以有4个元素。 $ 1是终端 GRAMPROG ,$ 2是嵌入式操作,$ 3是非终结记住,$ 4是非终结 stmtseq 。 ($ 2的值是嵌入式操作中分配给$$的任何值。目前它将是垃圾。)

答案 1 :(得分: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的值。