Действия среднего правила (MRA) реализованы как нетерминалы, которые соответствуют пустой последовательности. (Такие нетерминалы иногда называют «маркерами».) Действие среднего правила - это семантическое действие сгенерированного нетерминала.
Как и любой нетерминал, эти автоматически генерируемые маркеры имеют семантическое значение, которое устанавливается путем назначения $$
внутри действия. Однако нумерация $n
внутри MRA немного отличается от нумерации в обычных действиях. Внутри MRA каждый n
в $n
преобразуется в отрицательный индекс, представляющий значения на вершине стека при уменьшении маркера, путем вычитания собственного индекса MRA.
Отрицательные индексы всегда разрешены командой yacc / bison, но, как указано в руководстве, они довольно опасны и должны использоваться только в том случае, если вы можете доказать, что соответствующим образом введенное значение обязательно находится в указанной точке стека. В случае автоматически сгенерированных маркеров, yacc / bison может доказать это, потому что маркер используется только в одном производстве, а сгенерированные отрицательные индексы всегда попадают в ту часть стека, которая занята правой стороной, содержащей MRA.