3

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

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

A - (B - c) 

АСТ ниже:

- 
/\ 
A - 
    /\ 
    B C 

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

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

+0

Какой код вы генерируете? Если вы генерируете машинный код (как полагает большинство людей в этом контексте), тогда ваш вопрос немного бессмыслен. * Вы генерируете язык высокого уровня (er), например C? * – BCS 2010-12-01 03:20:53

+0

Извинения. Я предположил, что генерация языка более высокого уровня будет более распространенной или, по крайней мере, использование кода термина в отличие от сборки сделает это ясным. Я обновил вопрос, чтобы отразить это ... – Dan 2010-12-01 10:17:19

ответ

4

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

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

2

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^