Приоритет оператора: зачем разбирать унарные операторы таким образом? - PullRequest
1 голос
/ 22 апреля 2019

Я следую вместе с великой книгой Боба Нистрома "Создание переводчиков".

Пожалуйста, дайте мне знать, если этот вопрос слишком специфичен для этого сайта - я пытался часами, но не мог понять это самостоятельно:)

В главе Компиляция выражений , в функции unary() функция parsePrecedence(Precedence) вызывается с PREC_UNARY вместо PREC_UNARY + 1.

В книге объясняется, что это необходимо для включения "вложения" унарных операторов,Например: --1.

Однако в parsePrecedence(Precedence) не проверяется уровень приоритета перед синтаксическим анализом префикса операторов - он проверяется только перед infix unary является анализатором префиксов.

Таким образом, передача PREC_UNARY или PREC_UNARY + 1 в parsePrecedence(Precedence), похоже, не имеет значения.Чего мне не хватает?

1 Ответ

1 голос
/ 22 апреля 2019

Простой ответ заключается в том, что вы правы: с этой конкретной грамматикой нет никакой разницы, потому что ни один двоичный (или постфиксный) оператор не имеет приоритета PREC_UNARY, а тест, который будет использоваться, - & le;.

Тем не менее, общепринятым ответом является использование PREC_UNARY, потому что унарные префиксные операторы (обязательно) являются ассоциативными справа. Это соглашение происходит от случая бинарных операторов, где вам нужно использовать приоритет оператора плюс один для левоассоциативных операторов (нормальный случай) и сам приоритет оператора для правоассоциативных операторов (возведение в степень и присвоение, например). (Назначение на самом деле несколько сложнее, но я лично считаю, что решение, предложенное Бобом Нистромом, сложнее, чем было бы необходимо.)

Другой обычный ответ проистекает из возможности использования анализатора приоритета оператора снизу вверх («шунтирующий двор» Дейкстры) вместо синтаксического анализатора Пратта сверху вниз. Полное изучение анализа снизу вверх выходит далеко за рамки этого вопроса; достаточно сказать, что тот же принцип применим и к ассоциативности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...