Вопрос

Я написал базовый компилятор, который генерирует AST, правильно учитывая приоритет оператора в выражениях. Однако при выполнении генерации кода для создания кода C ++ я не уверен, как обрабатывать использование кронштейнов.

Для этого выражения:

A - (B - c)

АСТ ниже:

   -
  / \
 A   -
    / \
   B   C

Следует правильно генерировать предыдущее выражение, включая скобки, однако, если второй оператор был оператором дополнения (например), скобки были бы нецессари. Я бы предпочел использовать их только в том случае, если необходимо повысить читаемость.

Есть ли правила, диктующие такое поведение, и как узнать, когда использовать скобки. Плюс и минус имеют тот же уровень приоритета на большинстве языков, и я хотел бы сделать эту работу для всех операторов.

Это было полезно?

Решение

Исторически они называют это «красивой печати». Если вы Google Google Plus «приоритет», вы можете найти несколько примеров, чтобы помочь вам.

Неофициально, я думаю, что основная идея заключается в том, что, когда вы вспоминаете в подэкспрессию, вы сравниваете ее приоритет с текущим выражением. Если это ниже, вам нужны скобки. В противном случае вы этого не делаете. Ассоциативность может быть обработана, выполнив аналогичную проверку: если у подэкспрессии есть такой же Приоритет в качестве родителя вам нужны скобки, если он не в неверной стороне согласно ассоциативности.

Другие советы

Если операция с более высоким приоритетом ниже на дереве, вам не нужно вкладывать его в скобки.

Недостаточно знать приоритет операций, хотя. Вам также нужно знать ассоциативность операций. Это позволяет правильно группировать операции равного приоритета. Скажем, вычитание осталось ассоциативным, так A-B-C равно (A-B)-C, но не A-(B-C).

Просто запишите всю таблицу приоритета и Associativities для всех ваших операций и проконсультируйтесь с ней, поскольку вы генерируете свое выражение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top