Откуда здесь 4 доллара? - PullRequest
2 голосов
/ 26 июля 2011

Это первое правило Perl :

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

Как может $4 работать, когда на правой стороне только 3 элементов?

Ответы [ 2 ]

0 голосов
/ 23 августа 2011

Под покровом 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.

0 голосов
/ 29 июля 2011

Встроенное действие (код { PL_parser->expect = XSTATE; }, который происходит в середине правила) считается элементом.Итак, есть 4 элемента.$ 1 - это терминал GRAMPROG , $ 2 - встроенное действие, $ 3 - нетерминал запомнить , а $ 4 - нетерминал stmtseq .(Значение $ 2 - это любое значение, назначенное $$ во встроенном действии. В настоящее время это будет мусор.)

...