- •Вопрос 1
- •Определение 1.3. Цепочка, которая не содержит ни одного символа, называется пустой цепочкой и обозначается .
- •Определение 1.13. Цепочка , для которой существует вывод s*, называется сентенциальной формой или сентенцией в грамматике .
- •Вопрос 2
- •Вопрос 3
- •Расширение допускает единственное -правило вида s, но в этом случае начальный символ грамматики s не должен встречаться в правых частях правил.
- •Вопрос 4
- •3.1.2 Дерево разбора
- •Вопрос 5
- •Вопрос 6
- •Вопрос 7
- •Вопрос 8
- •Существуют следующие три способа представления функции переходов.
- •Вопрос 9 Алгоритм 2.4. Построение ка по регулярной грамматике.
- •Выход: ка .
- •Вопрос 10
- •Алгоритм 2.1. Преобразование нка в дка.
- •Вопрос 11
- •Алгоритм 2.2. Устранение недостижимых состояний ка.
- •Алгоритм 2.3. Объединение эквивалентных состояний ка.
- •Вопрос12
- •3.2.1 Проверка существования языка грамматики
- •3.2.2 Удаление бесполезных символов грамматики
- •Алгоритм 3.2. Устранение нетерминалов, не порождающих терминальных строк. Вход: кс-грамматика .
- •Алгоритм 3.3. Устранение недостижимых символов грамматики. Вход: кс-грамматика .
- •Определим множество достижимых символов z грамматики g, т.Е. Множество:
- •Вопрос13
- •3.2.3 Устранение -правил грамматики Алгоритм 3.4. Устранение -правил. Вход: кс-грамматика .
- •3.2.4 Устранение цепных правил Алгоритм 3.5. Устранение цепных правил. Вход: кс-грамматика .
- •Вопрос 14 Алгоритм 3.6. Устранение левой факторизации правил. Вход: кс-грамматика .
- •Алгоритм 3.7. Устранение прямой левой рекурсии. Вход: кс-грамматика .
- •Вопрос 15
- •Вопрос 16 Алгоритм 3.9. Построение мп-автомата по кс-грамматике.
- •Вопрос 17
- •Вопрос 18
- •18. 3.4.1 Рекурсивный спуск
- •Теорема 3.1. Достаточные условия применимости метода рекурсивного спуска.
- •Вопрос 19
- •Вопрос 20
- •Вопрос 21
- •21. Функционирование распознавателя цепочек для ll(1)-грамматик.
- •Вопрос 22
- •Вопрос 23 Алгоритм 3.16. Построение множеств l(a) и r(a).
- •Вопрос 24
- •Вопрос 26
- •Вопрос 27
- •Вопрос28
- •Вопрос 29
- •Вопрос 30
- •Вопрос 31
- •Вопрос 32. Определение 4.1. Транслятор – это программа, которая переводит входную программу на исходном (входном) языке в эквивалентную ей выходную программу на результирующем (выходном) языке.
- •Вопрос 33 Общая схема работы компилятора
- •Вопрос 34 ЛекАнализ программы
- •Вопрос 35
- •Вопрос 36
- •Вопрос 37
- •Вопрос 38
- •Вопрос 39
- •Вопрос 40
- •Вопрос 41 Свертка объектного кода программы.
- •Вопрос 42
- •Вопрос 43
- •Вопрос 44
- •Вопрос 45 Схемы компиляции
- •Вопрос 46
- •Вопрос 47
- •Вопрос 48
- •Вопрос 49
- •Вопрос 50
Вопрос 48
СУ-схемы предполагают существование отображения вида:
f: P1P2,
где P1 - множества правил грамматики исходного языка;
P2 - множество правил грамматики объектного языка.
Выделяют два метода построения объектной программы путем преобразования исходной программы.
1 СУ-компиляция – строит объектную программу по ходу синтаксического анализа. В этом случае строить полное дерево разбора исходной программы и сохранять его после синтаксического анализа не требуется.
2 СУ-перевод – строит объектную программу после синтаксического анализа по его результату, представленному в виде дерева разбора.
Рассмотрим метод построения объектной программы на основе СУ-перевода. В основу метода положено преобразование дерева разбора строки во входной грамматике GBX в дерево разбора выходной строки у в грамматике GBbIХ. Метод позволяет получить перевод (, у) любой входной строки путем последовательного решения следующих трех задач:
1) построение дерева разбора строки в грамматике GBX;
2) преобразование полученного дерева в дерево разбора соответствующей строки у в грамматике GBbIX, используя правила СУ-схемы;
3) получение выходной строку у по кроне дерева ее разбора.
Первая и третья задачи уже разобраны. Рассмотрим решение первой.
Алгоритм 5.1. Преобразование дерева разбора входной строки.
Введем обозначения:
1) А - произвольный нетерминал СУ-схемы;
2) А - правило входной грамматики, где = n1…nk.
Пусть нетерминалу А соответствует узел А дерева разбора. Тогда узлы 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 указывают на то, что она является не простой постфиксной схемой.
