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

3.5.1.2.4 Алгоритм «сдвиг-свертка» для грамматики операторного предшествования

Этот алгоритм в целом похож на алгоритм для грамматик простого предшество­вания, рассмотренный выше. Он также выполняется расширенным МП-автома­том и имеет те же условия завершения и обнаружения ошибок. Основное отличие состоит в том, что при определении отношения предшествования этот алгоритм не принимает во внимание находящиеся в стеке нетерминальные символы и при сравнении ищет ближайший к верхушке стека терминальный символ. Однако после выполнения сравнения и определения границ основы при поиске правила в грамматике нетерминальные символы следует, безусловно, принимать во вни­мание.

Алгоритм состоит из следующих шагов.

Шаг 1. Поместить в верхушку стека символ , считывающую головку — в нача­ло входной цепочки символов.

Шаг 2. Сравнить с помощью отношения предшествования терминальный сим­вол, ближайший к вершине стека (левый символ отношения), с текущим симво­лом входной цепочки, обозреваемым считывающей головкой (правый символ отношения). При этом из стека надо выбрать самый верхний терминальный сим­вол, игнорируя все возможные нетерминальные символы.

Шаг 3. Если имеет место отношение или =, то произвести сдвиг (перенос то­щего символа из входной цепочки в стек и сдвиг считывающей головки на один шаг вправо) и вернуться к шагу 2. Иначе перейти к шагу 4.

Шаг 4. Если имеет место отношение ·>, то произвести свертку. Для этого надо найти на вершине стека все терминальные символы, связанные отношение («основу»), а также все соседствующие с ними нетерминальные символы (при определении отношения нетерминальные символы игнорируются). Если терминальных символов, связанных отношением =, на верхушке стека нет, то в качестве основы используется один, самый верхний в стеке терминальный символ сте­ка. Все (и терминальные, и нетерминальные) символы, составляющие основу надо удалить из стека, а затем выбрать из грамматики правило, имеющее правую часть, совпадающую с основой, и поместить в стек левую часть выбранного правила. Если правило, совпадающее с основой, найти не удалось, то необходимо прервать выполнение алгоритма и сообщить об ошибке, иначе, если разбор не за­кончен, то вернуться к шагу 2.

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

Конечная конфигурация данного МП-автомата совпадает с конфигурацией при распознавании цепочек грамматик простого предшествования.

Пример

Дано: G({(, ), ^, &, ~, a}, {S, T, E, F}, P, S), где

P: SS^T | T

TT&E | E

E→~E | F

F→ (E) | a

Построить: распознаватель для G.

Таблица 3.10 - Построение множеств L(A) и R(A)

i

Li(A)

Ri(A)

0

L0(S)={S, T}

L0(T)={T, E}

L0(E)={~, F}

L0(F)={(, a}

R0(S)={T}

R0(T)={E}

R0(E)={E, F}

R0(F)={), a}

1

L1(S)={S, T, E}

L1(T)={T, E, ~, F}

L1(E)={~, F, (, a}

L1(F)={(, a}

R1(S)={T, E}

R1(T)={E, F}

R1(E)={E, F, ), a}

R1(F)={), a}

2

L2(S)={S, T, E, ~, F, (, a}

L2(T)={T, E, ~, F, (, a}

L2(E)={~, F, (, a}

L2(F)={(, a}

R2(S)={T, E, F, ), a}

R2(T)={E, F, ) a}

R2(E)={E, F, ), a}

R2(F)={), a}

3

L3(S)={S, T, E, ~, F, (, a}

L3(T)={T, E, ~, F, (, a}

L3(E)={~, F, (, a}

L3(F)={(, a}

R3(S)={T, E, F, ), a}

R3(T)={E, F, ) a}

R3(E)={E, F, ), a}

R3(F)={), a}

Таблица 3.11 - Построение множеств Lt(A) и Rt(A)

i

Lt(A)

Rt(A)

0

Lt0(S)={^}

Lt0(T)={&}

Lt0(E)={~}

Lt0(F)={(, a}

Rt0(S)={^}

Rt0(T)={&}

Rt0(E)={~}

Rt0(F)={), a}

1

Lt1(S)={^, &, ~, (, a }

Lt1(T)={&, ~, (, a}

Lt1(E)={~, (, a}

Lt1(F)={(, a}

Rt1(S)={^, &, ~, ), a}

Rt1(T)={&, ~, ), a}

Rt1(E)={~, ), a}

Rt1(F)={), a}

2

Lt2(S)={^, &, ~, (, a }

Lt2(T)={&, ~, (, a}

Lt2(E)={~, (, a}

Lt2(F)={(, a}

Rt2(S)={^, &, ~, ), a}

Rt2(T)={&, ~, ), a}

Rt2(E)={~, ), a}

Rt2(F)={), a}

Таблица 3.12 - Матрица операторного предшествования символов грамматики

Символы

^

&

~

(

)

а

^

·>

·>

·>

&

·>

·>

·>

·>

~

·>

·>

·>

·>

(

=

)

·>

·>

·>

·>

а

·>

·>

·>

·>

Для ^ находящейся в правиле вывода слева от нетерминала Т, во множество Lt(Т) входят символы &, ~, (, a , значит в строке матрицы для ^ ставим знак меньшего предшествования в позициях этих символов. С другой стороны этот символ ^ находится справа от S. Во множество Rt(S) входят символы ^, &, ~, ), a, значит знак большего предшествования ставится в столбце для ^ в позициях этих символов. Символы ( и ) в правиле вывода находятся радом, поэтому в позиции этих символов ставится знак равного предшествования (игнорируя нетерминал Е).

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