
- •Обзорная лекция по курсу «языки программирования и методы трансляции»
- •Основная литература
- •1 Описание языка программирования
- •2 Введение в трансляцию
- •3 Способы описания языка
- •4 Формальные языки и грамматики. Основные термины и определения
- •5 Порождающие грамматики (Грамматики н.Хомского1)
- •6 Классификация формальных грамматик
- •7 Автоматные грамматики и конечные автоматы
- •7.1. Механизмы распознавания и преобразования
- •7.2 Конечные автоматы
- •7.3 Способы задания конечных автоматов
- •Контекстно-свободные грамматики и языки
- •Проверка существования языка
- •Удаление бесполезных символов грамматики
- •Эквивалентные преобразования кс-грамматик
- •9.1 Устранение цепных правил
- •Удаление произвольного правила
- •9.3 Левая факторизация правил
- •9.4 Преобразование к нормальной форме Хомского
- •Распознающий автомат для кс- языков (автомат с магазинной памятью)
- •Разнозновидности мп-автоматов
- •11 Методы синтаксического анализа
- •Нисходящий разбор
- •Восходящий разбор
- •12 Генерация внутреннего представления программ
- •12.1 Польская запись
- •2 Алгоритм перевода на промежуточный язык
- •2.1 Полиз как промежуточный язык
12 Генерация внутреннего представления программ
На этапе семантического анализа также может решаться задача перевода программы на промежуточный язык. Промежуточная форма записи программы упрощает переход от машинно-независимых этапов трансляции к машинно-зависимым. Она обеспечивает удобство как генерации команд объектной программы, так и интерпретации исходной программы.
Результатом работы синтаксического анализатора должно быть некоторое внутреннее представление исходной цепочки лексем, которое отражает ее синтаксическую структуру. Программа в таком виде в дальнейшем может либо транслироваться в объектный код, либо интерпретироваться.
Основные свойства языка внутреннего представления программ:
он позволяет фиксировать синтаксическую структуру исходной программы;
текст на нем можно автоматически генерировать во время синтаксического анализа;
его конструкции должны относительно просто транслироваться в объектный код либо достаточно эффективно интерпретироваться.
Некоторые общепринятые способы внутреннего представления программ:
постфиксная запись
префиксная запись
многоадресный код с явно именуемыми результатами
многоадресный код с неявно именуемыми результатами
связные списочные структуры, представляющие синтаксическое дерево.
В основе каждого из этих способов лежит некоторый метод представления синтаксического дерева.
Замечание: чаще всего синтаксическим деревом называют дерево вывода исходной цепочки, в котором удалены вершины, соответствующие цепным правилам вида A → B, где A, B N.
12.1 Польская запись
Польский математик Ян Лукашевич обнаружил, что при использовании функциональной записи выражения, в которой операция предшествует своим операндам (а не записывается между ними), скобки становятся излишними.
Пример. Инфиксной форме записи A+B соответствует префиксная форма записи (ПОЛИЗ) +AB.
Префиксная форма (или польская запись) формально может быть определена следующим образом:
Всякая переменная или константа есть выражение.
Если 1 – знак унарной (одноместной) операции, а - выражение, то 1 является выражением
Если 2 – знак бинарной (двухместной) операции, а 1 и 2 - выражения, то 11 2 является выражением
Если n – знак n-местной операции, а 1, 2, …, n являются выражениями, то n1 2…n - выражение
Других выражений не существует
В отличие от обычной алгебраической записи выражений префиксная форма однозначно определяет порядок выполнения операций. Например, выражение A+B+C+D можно интерпретировать по-разному, а префиксная запись выражения всегда однозначно определяет порядок выполнения операций.
Полноскобочная форма выражения |
Префиксная форма выражения |
((((A+B)+C)+D) ((A+B)+(C+D)) ((A+(B+C))+D) (A+((B+C)+D)) (A+(B+(C+D))) |
+++ABCD ++AB+CD ++A+BCD +A++BCD +A+B+CD |
Постфиксная форма (польская инверсная запись - ПОЛИЗ) определяется следующими правилами:
Всякая переменная или константа есть выражение.
Если 1 – знак унарной (одноместной) операции, а - выражение, то 1 является выражением
Если 2 – знак бинарной (двухместной) операции, а 1 и 2 - выражения, то 1 2 1является выражением
Если n – знак n-местной операции, а 1, 2, …, n являются выражениями, то 1 2…n n - выражение
Других выражений не существует
Поскольку изображение операции «унарный минус» совпадает с изображением операции «бинарный минус», то унарный минус можно представлять двумя способами: либо записывать его как бинарный оператор, т.е. –В представлять в виде 0-В, либо для унарного минуса ввести новый символ операции, например, символ «!».
Пример. Выражение (A+B)*C можно представить в польской инверсной записи как АВ+С*