- •Лекция 11
- •Лексический анализатор.
- •Атрибуты лексем
- •Использование грамматик для лексического анализа
- •Регулярные выражения
- •Построение лексического анализатора по регулярному выражению
- •Структура Lex-программы
- •Способы записи регулярных выражений в Lex-программе
- •Лекция 12
- •Синтаксический анализ
- •Нисходящий разбор.
- •Нисходящий анализ.
- •Ll(1) - грамматики
- •Лекция 13
- •Восходящий разбор.
- •Восходящий синтаксический анализ.
- •Лекция 14
- •Видозависимый (семантический) анализ
- •Организация таблиц символов
- •Оптимизация кода
- •Генерация кода
- •Генераторы генераторов кода
- •Лекция 16
- •Промежуточные формы представления программ
- •Польская запись
- •Алгоритм вычисления выражений в обратной польской записи
- •Алгоритм э.Дейкстры перевода выражения в полиз (метод стека с приоритетами):
- •Тетрады (четверки).
- •Триады.
- •Перевод в полиз условных опереторов, операторов присваивания, операторов циклов.
- •Лекция 17
- •Формальные методы описания перевода.
Алгоритм э.Дейкстры перевода выражения в полиз (метод стека с приоритетами):
Каждому знаку операции присваивается числовой приоритет. Он начинается с цифры 2 и операции, выполняемой в первую очередь, имеют больший приоритет.
Открывающимся скобкам присваивается 0, закрывающимся 1.
Входная строка читается слева направо. Операнды по мере считывания помещаются в выходную строку.
Знаки перед записью в выходную строку помещаются в стек по следующему алгоритму:
открывающаяся скобка (знак с приоритетом 0) помещается в стек
если приоритет знака операции больше приоритета знака на вершине стека или стек пуст, новый знак добавляется в стек
если приоритет знака меньше или равен приоритету знака на вершине стека, из стека в выходную строку “выталкиваются” все знаки с приоритетами, большими или равными приоритету входного знака. После этого входной знак записывается в стек
закрывающаяся скобка выталкивается в выходную строку все знаки до открывающейся скобки. Открывающаяся скобка удаляется из стека, а закрывающаяся туда не записывается.

после просмотра всех символов входной строки из стека выталкиваются оставшиеся знаки.
Например:

|
стек |
Выходная строка |
|
( |
a |
|
+( |
ab |
|
|
ab+ |
|
/ |
ab+ |
|
(/ |
ab+c |
|
+(/ |
ab+cd |
|
/ |
ab+cd+ |
|
|
ab+cd+/ |
Тетрады (четверки).
Это одна из форм представления программ в трансляторе. Это представление удобно для выполнения оптимизирующих преобразований программ. Четверки часто используются в оптимизирующихся анализаторах. Их можно рассматривать как команду некоторого используется следующий формат.
Например:
Операция, операнд 1, операнд 2, результат.
представляется
в виде.
![]()
tl - временная переменная, в которой помещается результат .
Одна операция в арифметическом выражении порождает одну четверку. Выражение в целом - это последовательность четверок.
Пример:
1)
:
2)![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
Получить четверки
можно обходом семантического дерева
снизу вверх. Последняя четверка
соответствует последней выполняемой
операции, которая находится в корне
дерева, посещать при обходе нужно только
внутренние вершины дерева,
соответствующие
операции. Для назначения номеров
временных переменными
,
t2......нами уже была предусмотрена переменная counter. При выводе очередной четверки,
значение этой переменной увеличивается на 1 (+1).
Триады.
Также как тетрады, триады являются удобной промежуточной формой представления бинарных операций.
Формат имеет вид:
Операция, Операнд 1, Операнд 2
Здесь отсутствует поле для замен результата. Если необходимо использовать результат в качестве операнда, то в соответствующем поле записывается ссылка на триаду, в которой этот результат был получен.
Пример:
![]()
(1)
![]()
(2)
![]()
(3) -,(1),(2)
При использовании триад в качестве промежуточной формы экономится память по сравнению с тетрадами, т.к. часть временных переменных можно не хранить.
