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 回答