
- •Лабораторные работы по курсу «Прикладное программное обеспечение»
- •Москва 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) грамматики.
Лабораторная работа №4. Устранить из кс-грамматики бесполезные символы и ε–правила
4.1 Дана КС-грамматика G1 = {T, V, P, S0}
T = {a, b, c, d}
V = {A, B, C, F, S}
P = { S → b, S → CF, S→ cCB, A→ Ab, A→ c, B → cB, C→ Ca, F→ d }
S0 = {S}
4.2. Устранить бесполезные символы, ε-правила.
Шаг 1. Удаление непроизводящих символов.
N0 = Ø
N1 = {S, A, F} U Ø
N2 = {S, A, F} = N1
Грамматика G1 имеет вид:
G1′ = {{b, c, d}, {S, A, F}, { S → b, A→ Ab, A→ c, F→ d }, S}
Шаг 2. Удаление недостижимых символов из грамматики G1′.
N0 = {S}
N1 = {S} U {b}
N2 = {S, b} = N1
Преобразованная грамматика G1, не содержащая бесполезные символы.
G1′′ = {{b}, {S}, {S → b}, S}
Дана КС-грамматика G2 = {T, V, P, S0}
T = {a, b, c}
V = {S, A, B, C}
P = { S → b, S → C, S→ cCB, A→ Ab, A→ c, B → cB, C→ Ca, C→ ε }
S0 = {S}
Шаг 1. Построим множество укорачивающих нетерминалов Nε.
N0 = {C}
N1 = {C} U {S}
N2 = {C, S} = N1
Nε = {C, S}
Шаг 2. Устранение ε – правил.
P′ = Ø
S → C не будет входить в P′.
S→ cCB => S→ cCB, S→ cB;
C→ Ca => C→ Ca, C→ a;
S входит в Nε => добавляем новый нетерминал S′ и правила S′ → S и S′ → ε.
Преобразованная грамматика L2, не содержащая ε–правила.
G2′ = {{a, b, c}, {S′, S, A, B, C}, { S′ → S, S′ → ε, S→ cCB, S→ cB, S→ b, C→ Ca, C→ a, A→ Ab, A→ c, B → cB}, S′}
4.3. Реализация.
Console.WriteLine("\t\tPractic 2");
myGrammar G = new myGrammar(new ArrayList() { "a", "b", "c", "d" }, new ArrayList() { "S", "A", "B", "C", "F" }, "S");
G.AddRule("S", new ArrayList() { "b" });
G.AddRule("S", new ArrayList() { "C", "F"});
G.AddRule("S", new ArrayList() { "c", "C", "B" });
G.AddRule("A", new ArrayList() { "A", "b" });
G.AddRule("A", new ArrayList() { "c" });
G.AddRule("B", new ArrayList() { "c", "B" });
G.AddRule("C", new ArrayList() { "C", "a" });
G.AddRule("F", new ArrayList() { "d" });
Console.WriteLine("LAB 4 - DELETE UNUSEFUL SYMB");
G.DebugPrules();
Console.WriteLine("--------");
myGrammar GWitoutUnuseful = G.unUsefulDelete();
Console.WriteLine("\nNew Prules:");
GWitoutUnuseful.DebugPrules();
Console.WriteLine("-----------------------------------");
myGrammar G1 = new myGrammar(new ArrayList() { "b", "c" }, new ArrayList() { "S", "A", "B" }, "S");
G1.AddRule("S", new ArrayList() { "b" });
G1.AddRule("S", new ArrayList() { "c", "C", "B" });
G1.AddRule("S", new ArrayList() { "C" });
G1.AddRule("A", new ArrayList() { "A", "b" });
G1.AddRule("A", new ArrayList() { "c" });
G1.AddRule("B", new ArrayList() { "c", "B" });
G1.AddRule("C", new ArrayList() { "C", "a"});
G1.AddRule("C", new ArrayList() { "" });
Console.WriteLine("LAB 4 - DELETE EPSYLON RULES");
G1.DebugPrules();
Console.WriteLine("--------");
myGrammar GWithoutEps = G1.EpsDelete();
Console.WriteLine("--------");
GWithoutEps.DebugPrules();
Console.WriteLine("-----------------------------------\n");