Бизон: Как переменные $ ($ 1 $ 2 и т. Д.) Работают с нетексенами? - PullRequest
0 голосов
/ 16 июня 2019

Мне интересно, как переменные $ работают с не токенами, такими как блоки кода.И мой вопрос сводится к следующему:

У меня есть такое правило, с блоком кода в середине.В этом случае кто 3 $ и 4 $?

func-header: ret-type ID { strcpy(func_id,current_id); } LPAREN params RPAREN

Ответы [ 2 ]

3 голосов
/ 16 июня 2019

Действия среднего правила (MRA) реализованы как нетерминалы, которые соответствуют пустой последовательности. (Такие нетерминалы иногда называют «маркерами».) Действие среднего правила - это семантическое действие сгенерированного нетерминала.

Как и любой нетерминал, эти автоматически генерируемые маркеры имеют семантическое значение, которое устанавливается путем назначения $$ внутри действия. Однако нумерация $n внутри MRA немного отличается от нумерации в обычных действиях. Внутри MRA каждый n в $n преобразуется в отрицательный индекс, представляющий значения на вершине стека при уменьшении маркера, путем вычитания собственного индекса MRA.

Отрицательные индексы всегда разрешены командой yacc / bison, но, как указано в руководстве, они довольно опасны и должны использоваться только в том случае, если вы можете доказать, что соответствующим образом введенное значение обязательно находится в указанной точке стека. В случае автоматически сгенерированных маркеров, yacc / bison может доказать это, потому что маркер используется только в одном производстве, а сгенерированные отрицательные индексы всегда попадают в ту часть стека, которая занята правой стороной, содержащей MRA.

2 голосов
/ 16 июня 2019

В показанном правиле:

  • ret-type - это $1.
  • ID - $2.
  • Кодовый блок $3.
  • LPAREN - это $4.
  • params - это $5.
  • RPAREN - это $6.

Другими словами, кодовые блоки действуют как нетерминалы.

...