
- •3. Классификация языков по н. Хомскому.
- •4. Нотация Бэкуса-Наура
- •6. Дерево вывода. Левосторонний и правосторонний выводы
- •Пример построения Деревьев
- •Синтаксический анализ кс-языков
- •7. Однозначные и неоднозначные грамматики.
- •8. Основные понятия, связанные с процессами трансляции
- •9. Этапы и фазы процесса трансляции. Характеристики основных этапов
- •10. Цепочки символов. Понятие лексемы. Задачи лексического анализатора
- •11. Лексический анализ с помощью конечных автоматов
- •12. Алгоритм построения детерминированного конечного автомата по недетерминированному конечному автомату
- •14. Нормальная форма Хомского
- •16. Построение дерева синтаксического разбора.
- •17. Нисходящий синтаксический анализ
- •18. Ll(1) – грамматики
- •19. Восходящий синтаксический анализ
- •20. Таблицы транслятора
- •21. Организация таблиц символов компилятора
- •22. Основные элементы, требующие память во время выполнения.
- •23. Механизмы распределения памяти.
- •24. Стековое управление памятью.
- •25. Статическое управление памятью.
- •26. Управление кучей.
- •27. Сборка мусора.
19. Восходящий синтаксический анализ
Восходящий синтаксический анализ соответствует построению дерева разбора для входной строки, начиная с листьев (снизу) и идя по направлению к корню (вверх). Удобно описывать синтаксический анализ как процесс построения дерева разбора, хотя начальная стадия компиляции может быть в действительности выполнена и без явного построения дерева.
E -> TE’
E’ -> +TE’ | Є
T -> FT’
F -> *FT’ | Є
F -> (E) | id
Восходящий синтаксический анализ для строки id * id
id * id -> F * id -> F * id -> T * F -> T -> E
| | | | / | \ |
id F F id T * F T
| | | | / | \
id id F id T * F
| | |
id F id
|
id
Свертка
Можно рассмотреть восходящий синтаксический анализатор как процесс свертки строки ω к стартовому символу ω. На каждом шаге свертки определяется подстрока, соответствующая телу продукции из заголовка этой продукции. Ключевые решения, принимаемые в процессе восходящего синтаксического анализа – когда выполнять свертку и какую продукцию выбирать.
Пр.: на рис. представлена последовательность сверток. Свертка будет рассматриваться в терминах последовательности строк id * id, F * id, T * id, T * F, T, E. Строки этой последовательности образованы корнями всех поддеревьев на рис. Последовательность начинается со входной строки id * id. Первая свертка дает F * id. Путем свертывания крайнего левого id в F с использованием продукции F → id. Вторая свертка дает T * id при помощи свертывания F в T. После этого есть выбор между сверткой строки T, которая является телом продукции E → T и строки, состоящей из следующего id, являющегося телом продукции F → id. Вместо свертывания E → T свернем второй id в F. Получаем строку T * F. Затем эта строка сворачивается в T. Синтаксический анализ завершается сверткой T в стартовый E. По определению свертка представляет собой шаг обратный порождению.
Таким образом цель восходящего синтаксического анализа состоит в построении порождения в обратном порядке. Порождение, соответствующее синтаксическому анализу на рисунке.
E -> T -> T * F -> T * id -> F * id -> id * id.
Данное порождение является верным.
20. Таблицы транслятора
Информация о типе (виде) идентификаторов хранятся с помощью таблиц символов. Ими также пользуется генератор кода для хранения адресов значений во время прогона. В языках имеющих конечное число типов информацией о типе может быть просто целое число, представляющее этот тип; а в языках имеющих потенциально бесконечное число типов – указатель на таблицу видов – элементами которой являются структуры представляющие вид.
Таблицы символов
Для отслеживания области видимости и информации о связях имен компилятор использует таблицу символов. Она просматривается всякий раз, когда в исх.тексте встречается некоторое имя. При обнаружении нов. Имени или нов. Информации об имеющемся имени в табл. символов вносят соответствующие изменения.
Механизм таблицы символов должен обеспечивать эффективный поиск и добавление в табл. символов.
При работе с табл. символов очень полезно возможность ее динамического роста в процессе компиляции, если размер табл. символов зафиксирован при написании компилятора, то этот размер должен быть выбран достаточно большим, чтобы быть способным справиться с люб. исх. текстом.
Такой фиксированный размер будет большим для большинства программ и недостаточным для некоторых.
Каждый элемент таблицы символов соответствует объявлению имени. Формат элементов не обязан быть унифицированным, т.к. информация об имени зависит от его использования в программе.
Каждый элемент таблицы может быть реализован в виде записи, состоящей из последовательных слов памяти. Может оказаться удобным в целях унификации таблиц хранить часть информации об имени вне табл. а в табл. содержать только указатель на эту информацию. Информация вводится в табл. символов неоднократно. Ключевые слова вносятся в нее изначально, если вносятся вообще.
Запись может быть размещена в табл. символов когда роль описываемого ей имени становится ясна, а значение его атрибутов известно. В нек. Случаях запись может быть инициализирована лексическим анализатором, как только имя появляется во входном потоке.
Часто одно и то же имя может обозначать несколько различных объектов, возможно даже в одном блоке или процедуре.
Напр. В Си:
Int x;
Struct x {float y,z};
X используется и как целое число и как имя структуры с двумя полями.
В таких случаях лексический анализатор может предать синтаксическому анализатору только имя. (или указатель на лексему, образовавшую это имя), а не указатель на запись в табл. символов.
Запись в табл. символов в таком случае создается тогда когда выясняется синтаксическая роль этого имени.
А случае описания табл. символов будет создано две записи для целого Х и для структуры Х. Атрибуты имени вводятся в соответствии с объявлениями, которые могут быть и не явными. Метки часто являются лишь идентификаторами с двоеточиями так что единственными действием. Связанным с распознаванием такого идентификатора может быть занесение его в табл. символов. При работе с табл. символов очень полезна возможность для ее динамического роста в процессе компиляции.