- •Министерство образования и науки
- •Задание
- •1. Основные понятия порождающих грамматик
- •1.2. Классификация грамматик
- •1.3 Методика решения задач
- •1.4 Грамматический разбор
- •1.4.1. Представление грамматики в виде графа
- •2. Преобразования кс-грамматик
- •2.1. Удаление правил вида а → в
- •2.1.1 Графическая модификация метода
- •2.1.2. Построение неукорачивающей грамматики
- •2.1.3. Построение грамматики с продуктивными нетерминалами
- •2.1.4. Построение грамматики, аксиома которой зависит от всех нетерминалов
- •2.1.5. Удаление правил с терминальной правой частью
- •2.1.6. Построение эквивалентной праворекурсивной кс-грамматики
- •3. Приведение кс-грамматики к нормальному виду
- •3.1 Преобразования грамматик
- •3.2 Алгоритм удаления недостижимых символов
- •3.3 Исключение цепных правил
- •3.4 Описание процедур
- •3) Удаление недостижимых символов
- •4) Устранение правил с пустой правой частью
- •5) Исключение цепных правил
- •4. Приложение
- •Interface
- •Xpmnfst1: txpManifest;
- •Литература
3.3 Исключение цепных правил
Определение. Правило грамматики вида A > B, где A, B є VN, называется цепным.
Для КС-грамматики G, содержащей цепные правила, можно построить эквивалентную ей грамматику G', не содержащую цепных правил.
Идея доказательства заключается в следующем.
Если грамматика G имеет правила A > B, B > C, C > aX, то такие правила могут быть заменены одним правилом А > aX, поскольку вывод А => B => C => aX цепочки aX в грамматике G может быть получен в грамматике G' с помощью правила A >aX.
1. Для каждого А є N построить NA={B¦A =>*B} следующим образом:
а) Положить N0 = {A} и i=1.
б) Положить Ni ={C¦B>C принадлежит Р и В є Ni-1 } U Ni-1.
в) Если Ni ? Ni-1, положить i = i+1 и повторить шаг (б).
В противном случае положить NA = Ni.
2. Построить Р' так: если В > б принадлежит Р и не является цепным правилом, включить в Р' правило А > б для всех таких А, что В є NА.
3. Положить G' = (VT, VN, P', S).
В качестве примера выполним исключение цепных правил из грамматики G:
G = ({+,*, (,),a}, {E,T,F}, P={E > E+T | T, Т > T*F | F, F > (E) | a}, E).
Разобьем правила грамматики на два подмножества:
P1 = {E > T, T > F},
P2 = {E > E+T, T > T*F, F > (E) | a }
На шаге (1) NЕ = {E, T, F}, NT = {T, F}, NF = {F}. После шага (2) множество Р' станет таким
E > T+T | T*F | (E) | a
T > T*F | (E) | a
F > (E) | a
3.4 Описание процедур
1) Анализ
Входные данные: правила, введенные в Memo1.
Выходные данные: правила, выведенные в Memo2.
procedure TForm1. btn1Click (Sender: TObject);
label l;
BEGIN
mmo2. Clear;
for i: =0 to mmo1. Lines. Count do
if Length (mmo1. Lines [i]) >2 then begin
mm: = []; s: =mmo1. Lines [i];
for j: =0 to Length (s) do begin
if (s [j] in ['А'. 'Я']) or (s [j] in ['а'. 'я']) then mmo1. Lines. Delete (i);
mm: =mm+ [s [j]]; end;
if (not (s [1] in ['A'. 'Z'])) or (s [2] <>'-') or (' ' in mm) then mmo1. Lines. Delete (i);
end else mmo1. Lines. Delete (i);
for i: =0 to mmo1. Lines. Count do begin
s: =mmo1. Lines [i];
n: =Pos ('/',s); Delete (s,n,1);
m: =Pos ('/',s); Delete (s,m,1);
if (n>0) and (m>0) and (n<m) then begin
mmo2. Lines. Add (Copy (s,1,n-1));
mmo2. Lines. Add (Copy (s,1,2) +Copy (s,n,m-n));
mmo2. Lines. Add (Copy (s,1,2) +Copy (s,m,Length (s) - m+1));
goto l;
end;
IF n>0 then begin
mmo2. Lines. Add (Copy (s,1,n-1));
mmo2. Lines. Add (Copy (s,1,2) +Copy (s,n,Length (s) - n+1));
goto l;
end;
IF (n=0) and (Length (s) >2) then mmo2. Lines. Add (s);
l:
end;
for i: =0 to mmo2. Lines. Count do begin p [i]: =mmo2. Lines [i];
mn [i]: = [];
for j: =3 to Length (p [i]) do if p [i,j] in ['A'. 'Z'] then mn [i]: =mn [i] + [P [i,j]];
end;
END;
Пример выполнения:
Введем в Мемо1 следующие правила и нажмем на кнопку 1
грамматика алгоритм символ правило
2) Удаление бесплодных символов
Входные данные: правила из Мемо2
Выходные данные: правила в Мемо2 (без бесплодных символов)
procedure TForm1. btn2Click (Sender: TObject);
var vn2: set of Char;
begin
v: =mmo2. Lines. Count;
for i: =0 to v do p [i]: ='';
for i: =0 to v do begin p [i]: =mmo2. Lines [i];
mn [i]: = [];
for j: =3 to Length (p [i]) do
if p [i,j] in ['A'. 'Z'] then mn [i]: =mn [i] + [P [i,j]];
end;
mmo2. Clear;
vn: = [];
for i: =0 to v-1 do if mn [i] = [] then vn: =vn+ [p [i,1]];
vn2: = [];
j: =0;
while vn<>vn2 do begin
vn: =vn2;
for i: =0 to V-1 do
if (mn [i] - vn= [])
then vn2: =vn2+vn+ [p [i,1]];
end;
for i: =0 to v do
for j: =1 to Length (p [i]) do
if Length (p [i]) >2 then if (not (p [i,j] in vn)) and (p [i,j] in ['A'. 'Z']) then p [i]: ='';
for i: =0 to v do begin mn [i]: = [];
for j: =3 to Length (p [i]) do if p [i,j] in ['A'. 'Z'] then mn [i]: =mn [i] + [p [i,j]];
if Length (p [i]) >2 then mmo2. Lines. Add (p [i]);
end;
for i: =0 to v do p [i]: ='';
for i: =0 to mmo2. Lines. Count do begin p [i]: =mmo2. Lines [i];
mn [i]: = [];
for j: =3 to Length (p [i]) do
if p [i,j] in ['A'. 'Z'] then mn [i]: =mn [i] + [P [i,j]];
end;
end;
Пример использования:
1. Введем в Мемо1 правила
2. Нажмем на кнопку 1
3. Нажмем на кнопку 1