Ассоциативность и приоритет выражений при генерации кода C / C ++?
Вопрос
Я написал базовый компилятор, который генерирует AST, правильно учитывая приоритет оператора в выражениях. Однако при выполнении генерации кода для создания кода C ++ я не уверен, как обрабатывать использование кронштейнов.
Для этого выражения:
A - (B - c)
АСТ ниже:
-
/ \
A -
/ \
B C
Следует правильно генерировать предыдущее выражение, включая скобки, однако, если второй оператор был оператором дополнения (например), скобки были бы нецессари. Я бы предпочел использовать их только в том случае, если необходимо повысить читаемость.
Есть ли правила, диктующие такое поведение, и как узнать, когда использовать скобки. Плюс и минус имеют тот же уровень приоритета на большинстве языков, и я хотел бы сделать эту работу для всех операторов.
Решение
Исторически они называют это «красивой печати». Если вы Google Google Plus «приоритет», вы можете найти несколько примеров, чтобы помочь вам.
Неофициально, я думаю, что основная идея заключается в том, что, когда вы вспоминаете в подэкспрессию, вы сравниваете ее приоритет с текущим выражением. Если это ниже, вам нужны скобки. В противном случае вы этого не делаете. Ассоциативность может быть обработана, выполнив аналогичную проверку: если у подэкспрессии есть такой же Приоритет в качестве родителя вам нужны скобки, если он не в неверной стороне согласно ассоциативности.
Другие советы
Если операция с более высоким приоритетом ниже на дереве, вам не нужно вкладывать его в скобки.
Недостаточно знать приоритет операций, хотя. Вам также нужно знать ассоциативность операций. Это позволяет правильно группировать операции равного приоритета. Скажем, вычитание осталось ассоциативным, так A-B-C
равно (A-B)-C
, но не A-(B-C)
.
Просто запишите всю таблицу приоритета и Associativities для всех ваших операций и проконсультируйтесь с ней, поскольку вы генерируете свое выражение.