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

Вопрос28

28. Распознаватели LR(k)-грамматик основаны на построении дерева разбора снизу вверх и правостороннем выводе цепочек.

Определение 3.15. КС-грамматика обладает свойством LR(k), k0, если на каждом шаге вывода для однозначного решения вопроса о выполняемом действии расширенному МП-автомату достаточно знать содержимое верхней части стека и рассмотреть первые k символов от текущего положения считывающей головки автомата во входной цепочке символов.

Определение 3.16. Грамматика называется LR(k)-грамматикой, если она обладает свойством LR(k) для некоторого целого k0.

Первая литера «L» происходит от слова «left» и обозначает порядок чтения входной цепочки символов: слева - направо. Вторая литера «R» происходит от слова «right» и означает, что в результате работы распознавателя получается правосторонний вывод.

Для того чтобы формально определить LR(k) свойство для КС-грамматик, введем понятие пополненной КС-грамматики.

Определение 3.17. Грамматика G' является пополненной грамматикой, построенной на основании исходной грамматики G(VT, VN, P, S), если выполняются следующие условия:

1) грамматика G' совпадает с грамматикой G, если начальный символ S не встречается нигде в правых частях правил грамматики G;

2) грамматика G' строится как грамматика G(VT, VN {S'}, P {S'S}, S'), если начальный символ S встречается в правой части хотя бы одного правила из множества Р в исходной грамматике G.

Понятие «пополненной грамматики» введено для того, чтобы в процессе работы МП-автомата выполнение свертки к начальному символу пополненной грамматики S' служило сигналом к завершению алгоритма.

Дадим формальное определение LR(k) свойства.

Определение 3.18. Если для произвольной КС-грамматики G в ее пополненной грамматике G' для двух произвольных цепочек вывода из условий:

1) S' * αAω aβω;

2) S' * γВхαβу;

3) FIRST(k, ω) = FIRST(k, y);

следует, что αAω = γВх (то есть α = γ, А = В и ω = у), то доказано, что грамматика G обладает LR(k) свойством. Очевидно, что тогда и пополненная грамматика G' также обладает LR(k) свойством.

Распознаватель для LR(k)-грамматик функционирует на основе управляющей таблицы. Эта таблица состоит из двух частей, называемых «действия» и «переходы». По строкам таблицы распределены все цепочки символов на верхушке стека, которые могут приниматься во внимание в процессе работы распознавателя. По столбцам в области «действия» распределены все части входной цепочки символов длиной не более k (аванцепочки), которые могут следовать за считывающей головкой автомата в процессе выполнения разбора. В части «переходы» помещены все терминальные и нетерминальные символы грамматики, которые могут появляться на верхушке стека автомата при выполнении действий (сдвигов или сверток).

Клетки управляющей таблицы в части «действия» могут содержать один из следующих вариантов:

1) «сдвиг» - если в данной ситуации требуется выполнение сдвига (переноса текущего символа из входной цепочки в стек);

2) «успех» - если возможна свертка к начальному символу грамматики S и разбор входной цепочки завершен;

3) целое число («свертка») - если возможно выполнение свертки (число обозначает номер правила грамматики, по которому должна выполняться свертка);

4) «ошибка» - во всех других ситуациях.

Клетки управляющей таблицы в части «переходы» служат для выяснения номера строки таблицы, которая будет использована для определения выполняемого действия на очередном шаге. Эти клетки могут содержать следующие данные:

1) целое число - номер строки управляющей таблицы;

2) «ошибка» - во всех других ситуациях.

Для удобства работы распознаватель LR(k)-грамматики использует два специальных символа н и к. Считается, что входная цепочка символов всегда начинается символом н и завершается символом к.

Алгоритм 3.14. Функционирование распознавателя LR(k)-грамматики.

Шаг 1. Поместить в стек символ н и начальную (нулевую) строку управляющей таблицы. В конец входной цепочки поместить символ к. Перейти к шагу 2.

Шаг 2. Прочитать с вершины стека номер строки управляющей таблицы. Выбрать из этой строки часть «действие» в соответствии с аванцепочкой, обозреваемой считывающей головкой автомата. Перейти к шагу 3.

Шаг 3. В соответствии с типом действия выполнить одну из четырех операций:

1) «сдвиг» - если входная цепочка не прочитана до конца, прочитать и запомнить как «новый символ» очередной символ из входной цепочки, сдвинуть считывающую головку на одну позицию вправо, иначе прервать выполнение алгоритма и сообщить об ошибке;

2) целое число («свертка») - выбрать правило вывода в соответствии с номером, удалить из стека цепочку символов, составляющую правую часть выбранного правила, взять символ из левой части правила и запомнить его как «новый символ»;

3) «ошибка» - прервать выполнение алгоритма, сообщить об ошибке;

4) «успех» - выполнить свертку к начальному символу S, завершить выполнение алгоритма, сообщить об успешном разборе входной цепочки символов, если входная цепочка прочитана до конца, иначе сообщить об ошибке.

Конец выбора. Перейти к шагу 4.

Шаг 4. Прочитать с вершины стека номер строки управляющей таблицы. Выбрать из этой строки часть «переход» в соответствии с символом, который был запомнен как «новый символ» на предыдущем шаге. Перейти к шагу 5.

Шаг 5. Если часть «переход» содержит вариант «ошибка», тогда прервать выполнение алгоритма и сообщить об ошибке, иначе положить в стек «новый символ» с выбранным номером строки управляющей таблицы. Вернуться к шагу 2.

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