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

4.3. Обобщенные кс-грамматики и приведение их к удлиняющей форме

КС-грамматика называется обобщенной, если она содержит аннулирующие правила ( - правила), то есть правила вида A , где  - пустая цепочка. Обобщенная грамматика зачастую более проста и наглядна. Тем не менее следует помнить, что для любой обобщенной КС-грамматики существует эквивалентная неукорачивающая КС-грамматика.

Теорема 4.6. Каждая КС-грамматика приводима к виду с не более чем одним аннулирующим правилом S , которого может и не быть.

Доказательство. Проведем его, как обычно, конструктивно, построением неукорачивающей грамматики.

Во-первых, нужно определить, порождает ли исходная грамматика пустую цепочку. Пусть S - начальный символ исходной грамматики G. Определим в G множество нетерминалов X i , из которых пустую цепочку можно получить за i шагов, и множество новых нетерминалов Zi. Таким образом, мы определим аннулирующие нетерминалы.

X0 = { A | A } , Z0 = X0

X1 = { A | A , где  X0 } , Z1 = X1\ X0

....................................................................

X i = { A | A , где  X j } , Z i = X i\ X i-1

На каком-то шаге Z i станет равным и процесс формирования аннулирующих нетерминалов можно закончить. Если S X j, где , то L(G) и правила S добавлять не надо. В противном случае, заменим в исходной грамматике во всех правилах S на S1 , введем новый исходный нетерминал S и к правилам грамматики G добавим правила

S S1.

Все остальные правила вида A можно удалить. Для этого заменим каждое из правил, правые части которых содержат хотя бы по одному аннулирующему нетерминалу, множеством новых правил. Если правая часть правила содержит k вхождений аннулирующих нетерминалов, то множество, заменяющее это правило, будет состоять из 2k правил, соответствующих всем возможным способам удаления некоторых (или всех) из этих вхождений.

Пусть имеется правило

B 1 A 1 2 A 2 3 ... k A k k+1 ,

где A i ( ) - аннулирующие нетерминалы. Добавим к этому правилу следующие правила:

B 1 2 A 2 3 ... k A k k+1 , удалено A 1

B 1 A 1 2 3 ... k A k k+1 , удалено A 2

..................................

B 1 A 1 2 A 2 3 ... k k+1 , удалено A k

B 1 2 3 ... k A k k+1 , удалены A 1, A 2

..................................

B 1 2 3 ... k k+1 , удалены A 1, A 2, ... A k

Заметим, что в случае неоднозначности на этом шаге может получиться меньше чем 2k правил. Так, для аннулирующего нетерминала A правило

B aAA будет заменяться тремя правилами B aAAaAa , так как в данном случае безразлично первое или второе вхождение A мы рассматриваем.

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

В результате мы получим грамматику, эквивалентную исходной, что доказывается с использованием теорем 4.1 и 4.3.

Отметим, что мы рассматривали случай, когда аннулирующие нетерминалы имеют и другие альтернативы, кроме перехода в пустую цепочку. Если A единственная альтернатива нетерминала A, то правые части правил, содержащие его вхождение, можно просто исключить. 

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

Пример 4.5. Рассмотрим обобщенную КС-грамматику с аксиомой <число>

<число> <знак> <цел.часть> . <др.часть>

<знак> +-

<цел.часть> <цел.часть><цифра>

<др.часть> <цел.часть>

<цифра> 01...89

и приведем ее к неукорачивающей форме.

Вначале покажем, что данная грамматика не порождает пустой цепочки. Здесь

X0 = { <знак>, <цел.часть> },

X1 = { <др.часть> },

X2 = и Z2 = .

Среди множеств X - нет нетерминала <число> и, следовательно, правила

<число>

добавлять не надо.

Проведем замены правил, правые части которых содержат аннулирующие нетерминалы, а затем удалим - правила.

В результате получим грамматику

<число> <знак> <цел.часть> . <др.часть><цел.часть> . <др.часть>

<знак>. <др.часть><знак> <цел.часть> . . <др.часть>

<цел.часть> . <знак> . .

<цел.часть> <цел.часть><цифра><цифра>

<др.часть> <цел.часть>

<цифра> 01...89

На рис. 4.2 представлены деревья вывода цепочки +.9 по исходной (рис. 4.2 (а)) и результирующей (рис. 4.2 (б)) грамматикам.

Для приведения грамматики к удлиняющей форме необходимо кроме аннулирующих правил исключить и цепные правила. Цепное правило - это правило вида A B , где A, B .

Теорема 4.7. Для любой КС-грамматики существует эквивалентная ей грамматика без цепных правил.

Доказательство. Пусть в грамматике имеется правило A B и A S (A - не начальный символ грамматики). Тогда все правила вида C A заменим на правила C B, а правила A B удалим. Если A = S и для B существуют правила B 1... n , то заменим их на S 1... n , после чего S B удалим.

Любое такое преобразование правил допустимо исходя из теорем 4.1 - 4.3 и устраняет правила вида A B. Повторяем такие преобразования до тех пор, пока в грамматике не останется цепных правил. 

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

Пример 4.6. Пусть дана КС-грамматика с правилами

S aBa

B ABc

A aAbb .

Правило B A можно устранить, воспользовавшись результатами теоремы 4.2, и получить грамматику

S aBa

B aAbbBc

A aAbb

КС-грамматика G=(,,P,S) называется грамматикой без циклов, если в ней нет выводов A + A для A . КС-грамматика G называется приведенной, если она без циклов, без аннулирующих правил и без тупиков.

Грамматики с - правилами и циклами иногда труднее анализировать, чем грамматики без таковых. Кроме того, в любой практической ситуации тупики (бесполезные символы) без необходимости увеличивают объем анализатора. Поэтому для некоторых алгоритмов синтаксического анализа, рассматриваемых во второй части пособия, мы будем требовать, чтобы грамматики, фигурирующие в них, были приведенными. Это требование позволяет рассматривать все КС-языки.

Теорема 4.8. Если L - КС-язык, то L=L(G) для некоторой приведенной КС-грамматики G.

Доказательство. Применить к КС-грамматике, определяющей язык L, эквивалентные преобразования по теоремам 4.5 - 4.7. 

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