
- •Вопрос 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
Вопрос 23 Алгоритм 3.16. Построение множеств l(a) и r(a).
Шаг 1. Для каждого нетерминального символа А ищем все правила, содержание А в левой части. Во множество L(A) включаем самый левый символ из правой части правил, а во множество R(A) – самый крайний правый символ из правой части, т.е.
A VN: L0(A) = {X | AXy, X V, y V*},
R0(A) = {X | AyX, X V, y V*}.
Шаг 2. Для каждого нетерминального символа А: если множество L(A) содержит нетерминальные символы грамматики А, A, …, то множество L(A) надо дополнить символами, входящими в соответствующие множества L(А), L(A) и т.д., и не входящими в L(A). Аналогичную операцию выполнить для множеств R(A), т.е.
A VN: Li(A) = Li-1(A)Li-1(B), B (Li-1(A) VN),
Ri(A) = Ri-1(A)Ri-1(B), B (Ri-1(A) VN).
Шаг 3. Если на предыдущем шаге хотя бы одно множество L(A) или R(A) для некоторого символа грамматики изменилось, то вернуться к шагу 2, иначе построение закончено. Т.е. если существует AVN: Ri(A)Ri-1(A) или Li(A)Li-1(A), то положить i:=i+1 и вернуться к шагу 2, иначе построение закончено и R(A) = Ri(A) и L(A) = Li(A). Конец алгоритма.
Пример 3.16. Дана грамматика G({a, (, )}, {S, R}, P, S) с правилами P:
1)S(R| a; 2)RSa). Построить распознаватель для строки н(((aa)a)a)к.
Таблица 3.9 – Построение множеств L(A) и R(A) для грамматики G
Шаг |
Li(A) |
Ri(A) |
0 |
L0(S)={(, a} L0(R)={S} |
R0(S)={R, a} R0(R)={)} |
1 |
L1(S)={(, a} L1(R)={S, (, a} |
R1(S)={R, a, )} R1(R)={)} |
2 |
L2(S)={(, a} L2(R)={S, (, a} |
R2(S)={R, a, )} R2(R)={)} |
Результат |
L(S)={(, a} L(R)={S, (, a} |
R(S)={R, a, )} R(R)={)} |
Вопрос 24
24. Функционирование распознавателя для грамматик простого предшествования.
Шаг 1. Поместить в верхушку стека символ н, считывающую головку – в начало входной цепочки символов.
Шаг 2. До тех пор, пока не будет обнаружена ошибка, либо успешно завершен алгоритм разбора, сравниваем отношение простого предшествования символа на верхушке стека и очередного символа входной строки. При этом возможны следующие ситуации:
если самый верхний символ стека имеет меньшее или равное предшествование, чем очередной символ входной строки, то производим операцию «сдвиг» (перенос текущего символа из входной цепочки в стек и перемещение считывающей головки на один символ вправо);
если самый верхний символ стека имеет большее предшествование, чем очередной символ входной строки, то выполняем операцию «свертка». Для этого находим на верхушке стека «основу» сентенции, т.е. все символы, имеющие равное предшествование или один символ на верхушке стека. Символы основы удаляем из стека, выбираем правило вывода грамматики, имеющее правую часть, совпадающую с основой, и помещаем в стек левую часть выбранного правила.
если не установлено ни одно отношение предшествования между текущим символом входной цепочки и самым верхним символом в стеке, то алгоритм прерывается сообщением об ошибке;
если в стеке остаются символы нS, а во входном буфере только символ к, то входная строка прочитана полностью, и алгоритм разбора завершен успешно.
Этап 2. На основе построенных множеств и правил вывода грамматики составим матрицу предшествования символов (таблица 3.10).
Поясним заполнение матрицы предшествования. В правиле грамматики S(R символ ( стоит слева от нетерминального символа R. Во множество L(R) входят символы S, (, a. Ставим знак < в клетках матрицы, соответствующих этим символам, в строке для символа (.
В правиле грамматики RSa) символ a стоит справа от нетерминального символа S. Во множество R(S) входят символы R, a, ). Ставим знак > в клетках матрицы, соответствующих этим символам, в столбце для символа a.
В строке символа н ставим знак < в клетках символов, входящих во множество L(S), т.е. символов (, a. В столбце символа к ставим знак > в клетках, входящих во множество R(S), т.е. символов R, a, ).
В клетках, соответствующих строке символа S и столбцу символа a, ставим знак =, т.к. существует правило RSa), в котором эти символы стоят рядом. По тем же соображениям ставим знак = в клетках строки а и столбца ), а также строки ( и столбца R.
Матрица предшествования символов грамматики
|
Алгоритм работы распознавателя цепочки (((aa)a)a)
|