static void Main(string[] args) { f = new StreamWriter("output.txt", false); f.AutoFlush = true; grammar = new LL1Grammar("grammar.txt", false); // создать грамматику if (grammar.valid) //проверить грамматику { LexReader lexs = new LexReader("input.txt"); //загрузить лексемы table = new Table(); table.Build(grammar); //построить таблицу по грамматике if (ExecuteChecks(lexs, true)) //запуск проверки { f.WriteLine("Ошибок не найдено"); REC.recalc(); //4 пересчет размеров структур REC.save(f, 0); //4 вывод размеров структур } else { f.WriteLine("Ошибка в позиции {0}", lexs.Positions[lexindex]); } } else { f.WriteLine("Обнаружена ошибка в описании грамматики"); } Console.ReadKey(); }
public void Build(LL1Grammar Gr) // построить таблицу по грамматике { List <Rule> Rules = Gr.Grammar; List <int> ml = new List <int>(); List <int> mr = new List <int>(); string st = ""; int k = 0, t = 0; int i = 0; while (i < Rules.Count) { st = Rules[i].rname; for (int j = i; j < Rules.Count; j++) { if (Rules[i].rname != Rules[j].rname) { break; } Tbl.Add(new TableItem(Rules[j].rname, "")); if (i == j) { k = Tbl.Count - 1; } Program.listmergenew(Tbl[Tbl.Count - 1].terms, Rules[j].termchars); ml.Add(Tbl.Count - 1); t = j - i + 1; if (j > i) { error(Tbl.Count - 2, false); } } for (int j = i; j < i + t; j++) { if (Rules[i].rname != Rules[j].rname) { break; } for (int p = 0; p < Rules[j].rightnames.Count; p++) { TableItem tt = new TableItem(Rules[i].rname, Rules[j].rightnames[p]); Tbl.Add(tt); if (p == 0) { jump(k + j - i, Tbl.Count - 1); } if (Gr.IsRuleName(Rules[j].rightnames[p])) { for (int ttt = 0; ttt < Rules.Count; ttt++) { if (Rules[ttt].rname == Rules[j].rightnames[p]) { Program.listmergenew(Tbl[Tbl.Count - 1].terms, Rules[ttt].termchars); } } stack(Tbl.Count - 1, p < Rules[j].rightnames.Count - 1); } else if ((Rules[j].rightnames[p] != "E")) { Program.listaddnew(Tbl[Tbl.Count - 1].terms, Rules[j].rightnames[p]); accept(Tbl.Count - 1, true); Return(Tbl.Count - 1, p == Rules[j].rightnames.Count - 1); action(Tbl.Count - 1, Rules[j].action[p]); //** переписать действие в таблицу } else { Rules[j].rightnames[p] = "E"; Program.listmergenew(Tbl[Tbl.Count - 1].terms, Rules[j].termchars); Return(Tbl.Count - 1, p == Rules[j].rightnames.Count - 1); } } mr.Add(Tbl.Count - 1); } while (i < Rules.Count && st == Rules[i].rname) { i++; } } for (i = 0; i < Tbl.Count; i++) { bool b = false; for (int j = 0; j < ml.Count; j++) { if (ml[j] == i) { b = true; } } if (Gr.IsRuleName(Tbl[i]._s2) && !b) // из прав части { for (int j = 0; j < Tbl.Count; j++) { if (Tbl[j]._s1 == Tbl[i]._s2 && Tbl[j]._s2 == "") { jump(i, j); break; } } } b = false; for (int j = 0; j < mr.Count; j++) { if (mr[j] == i) { b = true; } } if (!Gr.IsRuleName(Tbl[i]._s2) && Tbl[i]._s2 != "") // из прав части { if (b) { jump(i, -1); } else { jump(i, i + 1); } } } }