Ассоциативность и приоритет выражений при генерации кода C / C ++? - PullRequest
3 голосов
/ 29 ноября 2010

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

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

A - (B - c)

АСТ ниже:

   -
  / \
 A   -
    / \
   B   C

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

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

Ответы [ 2 ]

4 голосов
/ 01 декабря 2010

Исторически, они называют это "красивой печатью". Если вы добавите в Google этот плюс "приоритет", вы можете найти несколько примеров, которые могут вам помочь.

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

2 голосов
/ 29 ноября 2010

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

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

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

...