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

Вопрос 48

СУ-схемы предполагают существование отображения вида:

f: P1P2,

где P1 - множества правил грамматики исходного языка;

P2 - множество правил грамматики объектного языка.

Выделяют два метода построения объектной программы путем преобразования исходной программы.

1 СУ-компиляция – строит объектную программу по ходу синтаксического анализа. В этом случае строить полное дерево разбора исходной программы и сохранять его после синтаксического анализа не требуется.

2 СУ-перевод – строит объектную программу после синтаксического анализа по его результату, представленному в виде дерева разбора.

Рассмотрим метод построения объектной программы на основе СУ-перевода. В основу метода положено преобразование дерева разбора строки во входной грамматике GBX в дерево разбора выходной строки у в грамматике GBbIХ. Метод позволяет получить перевод (, у) любой входной строки путем последовательного решения следующих трех задач:

1) построение дерева разбора строки в грамматике GBX;

2) преобразование полученного дерева в дерево разбора соответствующей строки у в грамматике GBbIX, используя правила СУ-схемы;

3) получение выходной строку у по кроне дерева ее разбора.

Первая и третья задачи уже разобраны. Рассмотрим решение первой.

Алгоритм 5.1. Преобразование дерева разбора входной строки.

Введем обозначения:

1) А - произвольный нетерминал СУ-схемы;

2) А - правило входной грамматики, где = n1nk.

Пусть нетерминалу А соответствует узел А дерева разбора. Тогда узлы n1, n2, …, nk - прямые потомки узла А. Преобразование дерева разбора начинается с его корня и состоит в следующем.

Шаг 1. Выбрать очередной нетерминальный узел А дерева разбора входной строки; если все узлы обработаны, завершить алгоритм.

Шаг 3. Устранить листья из множества узлов n1, …, nk (вершины, помеченные терминалами или );

Шаг 3. Найти в СУ-схеме правило вида (А , ) и переставить оставшихся прямых потомков узла А в соответствии с их размещением в строке (поддеревья перемещать вместе с их корнями).

Шаг 4. Добавить в качестве прямых потомков узла А листья так, чтобы метки всех его прямых потомков образовали цепочку .

Повторять шаги 1-4 для всех прямых нетерминальных потомков узла А по порядку слева направо.

Конец алгоритма.

Пример 5.3. Дана СУ-схема Т2 = ({x, y}, {S, A}, {0, 1), R, S), где R содержит правила:

1) S xAS, SA0 2) A xSA, AS0 3) S y, 1 4) A y, 1.

На рисунке 5.3а показано дерево разбора входной строки xxyyy. Применение алгоритма преобразования к корню S этого дерева устраняет левый лист, помеченный x (шаг 2).

Рисунок 5.3 - Преобразование дерева разбора: а - дерево входной строки; б - дерево после однократного применения алгоритма; в - дерево выходной строки

Далее, так как корню соответствует правило S xAS и для этого правила = SA0, нужно поменять местами оставшихся прямых потомков корня (шаг 3). Затем следует добавить 0 в качестве самого правого прямого потомка (шаг 4). Результатом будет дерево, показанное на рисунке 5.3б. Далее применяем алгоритм к первым двум потомкам корня. Обработка второго из них приводит еще к двукратному повторению алгоритма. Окончательный результат показан на рисунке 5.3в, это дерево разбора выходной строки 11100. Правил СУ-схемы Т2 указывают на то, что она является не простой постфиксной схемой.