Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Все_пособие_редактир.doc
Скачиваний:
175
Добавлен:
31.10.2018
Размер:
2.51 Mб
Скачать

8.11.1 Вычисление выражений с помощью обратной польской записи

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

  1. Если встречается операнд, то он помещается в стек (попадает в верхушку стека).

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

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

Вычисление выражения заканчивается, когда достигается конец записи выражения. Результат вычисления при этом всегда находится на верхушке стека. Очевидно, что данный алгоритм можно легко расширить и для более сложных операций, требующих три и более операндов [1].

На рис. 47 представлены примеры вычисления выражений в обратной польской записи.

Рис. 47. Вычисление выражений в обратной польской записи с использованием стека

Вопросы

1) Какие задачи в компиляторе решает семантический анализ?

2) Сравните между собой основные способы внутреннего представления программ.

3) На каких этапах компиляции лучше всего использовать каждый из этих способов?

4) Какие способы (или способ) внутреннего представления программы обязательно должен уметь обрабатывать компилятор?

5) Почему линейные участки легче всего поддаются оптимизации, чем все другие части внутреннего представления программы и объектного кода?

9. Синтаксически управляемая трансляция

Для трансляции конструкций языка программирования компилятору, помимо генерации кода может потребоваться отследить множество различных параметров. Например, компилятору может понадобиться информация о типе конструкции, расположении первой инструкции в целевом коде или количестве сгенерированных инструкций. Таким образом, можно говорить о некоторых абстрактных атрибутах, связанных с языковыми конструкциями – типах, строках, адресах памяти.

Значения атрибутов вычисляются согласно семантическим правилам, связанным с продукциями грамматики.

Существует два вида записи для связанных с продукциями семантических правил:

1) синтаксически управляемые определения – представляют собой высокоуровневые спецификации трансляции, скрывающие множество деталей реализации и освобождающие пользователя от явного указания порядка выполнения трансляции;

2) схемы трансляции - указывают порядок, в котором выполняются семантические правила; так что эти схемы показывают определенную часть деталей реализации.

Концептуально при обоих методах разбирается входной поток лексем, строится дерево разбора и обходится так, как необходимо для выполнения семантических правил в узлах дерева разбора (рис. 48). Выполнение семантических правил может генерировать код, сохранять информацию в таблице символов, выводить сообщения об ошибках или выполнять какие-либо другие действия. Результат трансляции потока лексем будет получен путем выполнения указанных семантических правил.

Рис. 48. Концепция синтаксически управляемой трансляции

Реализация не всегда следует приведенной на рис. 48 схеме. Частные случаи синтаксически управляемых определений могут быть реализованы за один проход выполнением семантических правил в процессе синтаксического анализа, без явного построения дерева разбора или графа, показывающего взаимосвязи между атрибутами. Например, подкласс СУ-определений, именуемый L-атрибутными определениями, включает практически все этапы трансляции, которые могут выполняться без явного построения дерева разбора.