Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Shpory_tyap (1).doc
Скачиваний:
40
Добавлен:
17.04.2019
Размер:
1.05 Mб
Скачать

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 используется и как целое число и как имя структуры с двумя полями.

В таких случаях лексический анализатор может предать синтаксическому анализатору только имя. (или указатель на лексему, образовавшую это имя), а не указатель на запись в табл. символов.

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

А случае описания табл. символов будет создано две записи для целого Х и для структуры Х. Атрибуты имени вводятся в соответствии с объявлениями, которые могут быть и не явными. Метки часто являются лишь идентификаторами с двоеточиями так что единственными действием. Связанным с распознаванием такого идентификатора может быть занесение его в табл. символов. При работе с табл. символов очень полезна возможность для ее динамического роста в процессе компиляции.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]