- •Лабораторные работы по курсу «Прикладное программное обеспечение»
- •Москва 2012 Лабораторная работа №1.
- •Лабораторная работа №2. Спроектировать конечный автомат, составить диаграмму переходов ка и реализовать.
- •Лабораторная работа №3. Определить свойства ка. Построить ндка. Реализовать преобразование ндка в дка.
- •Лабораторная работа №4. Устранить из кс-грамматики бесполезные символы и ε–правила
- •Лабораторная работа №5. Устранить из kс-грамматики цепные правила и устранить левую рекурсию.
- •Лабораторная работа №6. Определить форму кс-грамматики и сделать ее приведение.
- •Лабораторная работа №8. Реализовать мп автомат для приведенной кс-грамматики
- •Лабораторная работа №9. Для ll(1) анализатора построить управляющую таблицу m
- •Лабораторная работа №10. Аналитически написать такты работы ll(1) анализатора для выведенной цепочки.
- •Лабораторная работа №11. Реализовать управляющую таблицу m для ll(k) анализатора.
- •Лабораторная работа №12.
- •Лабораторная работа №13. Определить функцию перехода g(х)
- •14.1. Построить каноническую форму множества ситуаций
- •Лабораторная работа №15. Построить управляющую таблицу для функции перехода g(х) и действий f(u).
- •Лабораторная работа №16. Реализовать lr(1)-анализатор по управляющей таблице (g,f) для lr(1) грамматики.
Лабораторная работа №5. Устранить из kс-грамматики цепные правила и устранить левую рекурсию.
5.1. Устранение цепных правил.
Дана КС-грамматика G3 = {T, V, P, S0}
T = {a, b, c}
V = {A, B, C, S}
P = {S → b, S → C, S→ cCB, A→ Ab, A→ C, B → cB, C→ Ca, C→ b}
S0 = {S}
Шаг 1.
Ns = {S, C}
NA = {A, C}
NB = {B}
NC = {C}
Шаг 2. Составление правил P′.
S: S → b, S → Ca, S→ b, S→ cAB
A: A→ Ab, A→ Ca, A→ b
B: B → cB
C: C→ Ca, C→ b
Преобразованная грамматика G3, не содержащая цепные правила.
G3′ = {{a, b, c}, {S, A, B, C}, { S → b, S → Ca, S→ b, S→ cAB, A→ Ab,
A→ Ca, A→ b, B → cB, C→ Ca, C→ b }, S}
5.2.Устранение левой рекурсии.
Дана КС-грамматика G4 = {T, V, P, S0}
T = {a, b, c}
V = {A, B, C, S}
P = {S → AB, S → SC, A→ BB, A→ Ab, A→ a, B → b, C→ Ca, C→ b}
S0 = {S}
1) Для правил S → AB, S → SC преобразованная грамматика будет содержать правила: S → ABS′, S′ → C, S → AB.
2) Для правил A→ BB, A→ Ab, A→ a преобразованная грамматика будет содержать правила: A→ BBA′, A′→ b, A→ aA′, A→ a, A→ BB.
3) Для правил C→ Ca, C→ b преобразованная грамматика будет содержать правила: C′→ a, C→ bC′, C→ b.
Преобразованная грамматика G4, не содержащая левую рекурсию.
G4′ = {{a, b, c},{S, A, B, C, S′, A′, C′},{S → ABS′, S′ → C, S → AB,
A→ BBA′, A′→ b, A→ aA′, A→ a, A→ BB, C′→ a, C→ bC′, C→ b, B → b},S}
5.3.Реализация алгоритма.
myGrammar G2 = new myGrammar(new ArrayList() { "b", "c", "a" }, new ArrayList() { "S", "A", "B", "C" }, "S");
G2.AddRule("S", new ArrayList() { "b" });
G2.AddRule("S", new ArrayList() { "c", "C", "B" });
G2.AddRule("S", new ArrayList() { "C" });
G2.AddRule("A", new ArrayList() { "A", "b" });
G2.AddRule("A", new ArrayList() { "C" });
G2.AddRule("B", new ArrayList() { "c", "B" });
G2.AddRule("C", new ArrayList() { "C", "a" });
G2.AddRule("C", new ArrayList() { "b" });
Console.WriteLine("LAB 5 - DELETE CHAIN RULES");
G2.DebugPrules();
Console.WriteLine("--------");
myGrammar GwithoutChains = G2.ChainRuleDelete();
Console.WriteLine("--------");
GwithoutChains.DebugPrules();
Console.WriteLine("-----------------------------------\n");
myGrammar G3 = new myGrammar(new ArrayList() { "b", "c","a"},
new ArrayList() { "S", "A", "B", "C" }, "S");
G3.AddRule("S", new ArrayList() { "A", "B" });
G3.AddRule("S", new ArrayList() { "S", "C"});
G3.AddRule("A", new ArrayList() { "B", "B" });
G3.AddRule("A", new ArrayList() { "A", "b" });
G3.AddRule("A", new ArrayList() { "a" });
G3.AddRule("C", new ArrayList() { "C", "a" });
G3.AddRule("C", new ArrayList() { "b" });
G3.AddRule("B", new ArrayList() { "b" });
Console.WriteLine("LAB 5 - DELET LEFT RECURS");
G3.DebugPrules();
Console.WriteLine("--------");
myGrammar GwithoutLR = G3.LeftRecursDelete();
Console.WriteLine("--------");
GwithoutLR.DebugPrules();
