Опубликован: 06.08.2007 | Доступ: свободный | Студентов: 1904 / 1056 | Оценка: 4.45 / 4.29 | Длительность: 18:50:00
Специальности: Программист
Лекция 5:

Синтаксический анализ

Преобразования КС-грамматик

Рассмотрим ряд преобразований, позволяющих "улучшить" вид контекстно-свободной грамматики без изменения порождаемого ею языка.

Назовем символ X \in (N \cup T) недостижимым в КС- грамматике G = (N, T, P, S), если X не появляется ни в одной выводимой цепочке этой грамматики. Иными словами, символ X является недостижимым, если в G не существует вывода S \Rightarrow ^{*} \alpha X\beta ни для каких \alpha, \; \beta \in (N \cup T)^*.

Назовем символ X \in (N \cup T) несводимым (бесплодным) в той же грамматике, если в ней не существует вывода вида X =>* xwy, где w, x, y принадлежат T*.

Очевидно, что каждый недостижимый и/или несводимый символ является бесполезным, как и все правила, его содержащие.

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

Алгоритм 4.1. Устранение недостижимых символов.

Вход. КС-грамматика G = (N, T, P, S).

Выход. КС-грамматика G' = (N', T', P', S) без недостижимых символов, такая, что L(G') = L(G).

Метод. Выполнить шаги 1-4:

(1) Положить V0 = {S} и i = 1,

(2) Положить Vi = {X | в P есть A \to  \alpha X\beta и A \in V_{i-1} \} \cup V_{i-1},

(3) Если V_{i} \ne  V_{i-1}, положить i = i + 1 и перейти к шагу 2, в противном случае перейти к шагу 4,

(4) Положить N' = V_{i} \cap  N, T' = V_{i} \cap  T. Включить в P' все правила из P, содержащие только символы из Vi.

Алгоритм 4.2. Устранение несводимых символов.

Вход. КС-грамматика G = (N, T, P, S).

Выход. КС-грамматика G' = (N', T', P', S) без несводимых символов, такая, что L(G') = L(G).

Метод. Выполнить шаги 1-4:

(1) Положить N' = T и i = 1,

(2) Положить N_i = \{A \! \mid \!A  \rightarrow \alpha \in P \; \text{и} \; \alpha \in (N_{i-1})^*\} \cup N_{i-1},

(3) Если N_{i} \ne  N_{i-1}, положить i = i + 1 и перейти к шагу 2, в противном случае положить Ne = Ni и перейти к шагу 4,

(4) Положить G_{1} = ((N \cap  N_{e}) \cup  \{ S\} , T, P_{1}, S), где P1 состоит из правил множества P, содержащих только символы из N_{e} \cup  T,

Чтобы устранить все бесполезные символы, необходимо применить к исходной грамматике сначала Алгоритм 4.2, а затем Алгоритм 4.1.

Пример. Все символы следующей грамматики

S -> AS | b

A -> AB

B -> a

являются достижимыми. Поэтому нарушение предложенного порядка применения к ней алгоритмов приведет лишь к частичному решению задачи.

КС-грамматика без бесполезных символов называется приведенной. Легко видеть, что для любой КС-грамматики существует эквивалентная приведенная. В дальнейшем будем предполагать, что все рассматривамые грамматики - приведенные.

Алгоритм Кока-Янгера-Касами

Приведем алгоритм синтаксического анализа, применимый для любой грамматики в нормальной форме Хомского

Алгоритм Кока-Янгера-Касами

Вход. КС-грамматика G = (N, T, P, S) в нормальной форме Хомского и входная цепочка w = a_1a_2 \ldots a_n \in T^+.

Выход. Таблица разбора Tab для w такая, что A \in t_{ij} тогда и только тогда, когда A =>+ aiai+1 ... ai+j-1.

Метод.

(1) Положить t_{i1} = \{A \mid A \rightarrow a_i \in P\} для каждого i. Так что, если A \in t_{i1}, то A =>+ ai.

(2) Пусть tij вычислено для 1<=i<=n и 1<= j' < j. Положим tij = {A| для некоторого 1 <= k < j правило A \rightarrow BC \in P, B \in t_{ik}, C \in t_{i+k,j-k} \}.

Так как 1 <= k < j, то k < j и j - k < j. Так что tik и ti+k,j-k вычисляются раньше, чем tij. Если A \in t_{ij}, то A => BC =>+ ai ai+k-1 C =>+ aI ... ai+k-1ai+k ... ai+j-1.

(3) Повторять шаг 2 до тех пор, пока не станут известны tij для всех 1 <= i <= n и 1 <= j <= n-i+1.

Алгоритм нахождения левого разбора по таблице разбора Tab.

Вход. КС-грамматика G = (N, T, P, S) в нормальной форме Хомского с правилами, занумерованными от 1 до p, входная цепочка w = a_1a_2 \ldots a_n \in T^+ и таблица разбора Tab.

Выход. Левый разбор цепочки w или сигнал ошибка.

Метод. Процедура gen(i, j, A):

(1) Если j = 1 и A => ai = pm, выдать m.

(2) Пусть j > 1 и k - наименьшее из чисел от 1 до j-1, для которых существует B \in t_{ik}, C \in t_{i+k,j-k} и правило pm = A -> BC. Выдать m и выполнить gen(i, k, B), затем gen(i + k, j - k, C).

Выполнить gen(1, n, S), если S \in t_{1,n}, иначе ошибка.