Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
pos.doc
Скачиваний:
161
Добавлен:
10.06.2015
Размер:
2.55 Mб
Скачать

5.1.4 Практическое применение су-схем

СУ-схемы предполагают существование отображения f: P1 —> P2 множества правил грамматики исходного языка в множество пра­вил грамматики объектного языка.

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

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

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

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

- построить дерево разбора w в грамматике GBX;

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

- получить выходную строку у, взяв крону дерева разбора строки у.

Алгоритм преобразования дерева разбора входной строки

Обозначим: А — произвольный нетерминал СУ-схемы, А —> — правило входной грамматики, где = n1nk . Пусть нетерминалу А соответствует узел А дерева разбора (нетерминальный узел). Тогда узлы n1,n2 , . . ., nk - прямые потомки узла А. Преобразование дерева разбора начинается с его корня и состоит в следующем:

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

  2. устранить листья из множества узлов n1nk (вершины, помеченные терминалами или );

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

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

  5. повторять п. 1—4 для всех прямых нетерминальных потом­ ков узла А по порядку, слева направо.

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

1) S->0AS,SAa 2) A->0SA,ASa 3) S->1,b 4) A->1,b.

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

Рисунок 5.2 - Преобразование дерева разбора: а - дерево входной строки;

б - дерево после однократного применения алгоритма;

в - дерево выходной строки

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

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