Ассоциативность операторов
По соглашению 9+5+2 эквивалентно (9+5)+2, а 9-5-2 эквивалентно (9-5)-2. Когда операнд типа 5 имеет операторы и слева, и справа, необходимо установить, какой именно оператор использует этот операнд. Мы говорим, что оператор + левоассоциативен, поскольку операнд со знаками "плюс" с обеих сторон используется левым оператором. В большинстве языков программирования четыре арифметических оператора — сложение, вычитание, умножение и деление — левоассоциативны.
Некоторые распространенные операторы, например возведение в степень, правоассоциативны. Другим примером правоассоциативного оператора может служить оператор присвоения (=) в С, где выражение а=b=с трактуется как а= (b=с).
Строки типа а=b=с с правоассоциативным оператором генерируются следующей грамматикой.
right → letter = right | letter
letter → a|b|…|z
Различия между деревьями разбора для левоассоциативных операторов типа "-" и правоассоциативных операторов вроде "=" показаны на рис. 2.4. Обратите внимание, что дерево разбора для 9-5-2 растет вниз влево, в то время как дерево разбора для а=b=с — вниз вправо.
Рис. 2.4. Деревья разбора для лево- и правоассоциативных операторов
[1] В настоящее время наличие языка структурированных запросов SQL снимает вопрос о том, является ли интерпретация запросов задачей, всего лишь схожей с компиляцией. — Прим. перев.
[2] Здесь следует обратить внимание на перевод термина statement. Дословно statement означает высказывание, утверждение, однако в применении к компьютерной тематике это не совсем удачно. Обычно при переводе используется термин оператор, но в данной книге, посвященной формальным языкам, этот термин имеет собственное значение. Поэтому при переводе термина statement за редкими исключениями было использовано понятие инструкция — как наиболее близкое по смыслу, так и уже используемое при описании языка, например, в книге Б. Страуструп. Язык программирования С++, 3-е изд. — СПб.; М.: "НевскийДиалект"— "ИздательствоБИНОМ", 1999. — Прим. перев.
[3] Следует упомянуть о важности вопроса выделения памяти для размещения идентификаторов исходной программы. Как мы увидим в главе 7, "Среды времени исполнения", распределение памяти в процессе работы зависит от компилируемого языка. Принятие решения о выделении памяти происходит либо в процессе создания промежуточного кода, либо при генерации целевого кода.
[4] "Почти произвольные" строки, поскольку производится только простое сканирование макроса. Как только при сканировании находится символ, соответствующий тексту, следующему после #i в шаблоне, сканированная строка считается соответствующей формальному параметру #i. Таким образом, если мы попытаемся подставить ab; cd вместо #1, обнаружим, что параметру #1 соответствует строка ab, а параметру #2 — строка cd.
[5] Slanted — наклоненный. — Прим. перев.
[6] Вообше говоря, нетерминал представляет множество последовательностей токенов. — Прим. ред.
[7] Отдельные символы, выделенные курсивом, будут использоваться и для других целей при детальном изучении грамматики в главе 4, "Синтаксический анализ". Например, они будут применяться при указании символов, которые могут представлять собой либо токены, либо нетерминалы. Однако выделенное курсивом имя из двух или более символов будет всегда означать нетерминал.
Дата добавления: 2015-11-30; просмотров: 21 | Нарушение авторских прав
mybiblioteka.su - 2015-2024 год. (0.005 сек.)