public static void Group_G(Graf g) { var par_list = new List <string>(); for (int i = 0; i < g.Lista_noduri.Count(); i++) { int ok = 0; var curent = g.Lista_noduri[i].Split(',')[0]; var curent1 = g.Lista_noduri[i].Split(',')[1]; for (int j = 0; j < par_list.Count; j++) { if (par_list[j].Contains(curent)) { par_list[j] += "/" + curent1; ok = 1; break; } } if (ok == 0) { par_list.Add(g.Lista_noduri[i]); } } for (int i = 0; i < par_list.Count; i++) { var u = par_list[i].Split(',')[1].Replace("/", "").Distinct(); var k = ""; foreach (var iter in u) { k += "/" + iter; } par_list[i] = par_list[i].Split(',')[0] + "," + k.Substring(1); } g.Lista_noduri = par_list; }
static void Main(string[] args) { Graf g = new Graf(); Grammer = new List <string>(); ContextList = new List <string>(); current_terminals = new List <string>(); Graf_List = new List <Graf>(); Dictionary_Grammer = new Dictionary <int, string>(); AnalyzeList = new List <Analyze_Table>(); MatrixTable = new List <List <String> >(); All_Symbols = new List <string>(); parcurs = new List <bool>(); lista_intrari = new List <string>(); parcurs_first = new List <bool>(); string[] lines = System.IO.File.ReadAllLines(@"C:\Users\Asus\source\repos\LR\LR\input.txt"); foreach (var item in lines) { var split1 = item.Split('>'); var split2 = split1[1].Split('|'); foreach (var item1 in split2) { Grammer.Add(split1[0] + ">" + item1); parcurs.Add(false); parcurs_first.Add(false); } } All_Symbols = Get_Terminals(); var m = Get_Terminals(); for (int i = 0; i < Grammer.Count(); i++) { Dictionary_Grammer.Add(i, Grammer[i]); } g.Lista_noduri.Add("S'>.S,$"); g.nivel = 0; Create_I0("S'>.S,$", g); Group_G(g); Graf_List.Add(g); int contor_global = 1; var copy = Graf_List; var current_count = Graf_List.Count(); var contor_iterator = 0; var last = 0; while (true) { for (int i = last; i < current_count; i++) { var w = i; var graf = copy[i]; Dictionary <string, List <string> > group_dic = new Dictionary <string, List <string> >(); foreach (var item in graf.Lista_noduri) { var split = item.Split('.')[1][0].ToString(); if (group_dic.ContainsKey(split)) { group_dic[split].Add(item); } else { group_dic.Add(split, new List <string>() { item }); } } int ok = 0; foreach (var item in group_dic) { var aux_list = new List <Graf>(); bool is_one = true; for (int j = 0; j < group_dic[item.Key].Count; j++) { /* if (ok == 0 && group_dic[item.Key].Count > 0) * { * ok = 1; * foreach (var k in group_dic[item.Key]) * { * g.Lista_noduri.Add(k); * } * }*/ g = new Graf(); var index = item.Value[j].IndexOf('.'); var nextChar = item.Value[j][index + 1]; if (nextChar.Equals(',') == false) { g.pleaca = item.Value[j].Split('.')[1][0].ToString(); string move = Move_Dot(item.Value[j], contor_global); g.Lista_noduri.Add(move); Create_I0(move, g, 0); g.nivel = contor_global; g.pozi = i; var exist = copy.Any(elem => elem.Lista_noduri.ElementAt(0).Equals(move)); if (exist == false && item.Value.Count == 1) { Group_G(g); Graf_List.Add(g); } else if (exist == false && item.Value.Count > 1) { is_one = false; aux_list.Add(g); } } else { //var exist = copy.Any(elem => elem.Lista_noduri.ElementAt(0).Equals(copy[i].Lista_noduri[j])); //if(exist == false) //{ // g.Lista_noduri.Add(copy[i].Lista_noduri[j]); // Graf_List.Add(g); //} } } if (is_one == false) { foreach (var ii in aux_list) { List <string> copyIi = new List <string>(); copyIi.Add(ii.Lista_noduri[0]); ii.Lista_noduri = copyIi; } var gg = new Graf(); gg.nivel = aux_list.ElementAt(0).nivel; gg.pozi = aux_list.ElementAt(0).pozi; gg.pleaca = aux_list.ElementAt(0).pleaca; foreach (var item2 in aux_list) { foreach (var item3 in item2.Lista_noduri) { //var exist = copy.Any(elem => elem.Lista_noduri.Contains(item3)); //if (exist == false) //{ gg.Lista_noduri.Add(item3); //} } } Create_I0(gg.Lista_noduri[0], gg); Group_G(gg); //var group_p = gg.Lista_noduri.GroupBy(elem => elem.Split(',')[0]); Graf_List.Add(gg); } } } if (Graf_List.Count() == current_count) { break; } else { last = current_count; current_count = Graf_List.Count(); contor_global++; } } Create_Table(); Display_Table(); if (IS_Lr() == true) { Console.WriteLine("Este gramatica data de LR(1)"); Console.Write("Numarul de elemente:"); var lungime = Console.ReadLine(); for (int i = 0; i < int.Parse(lungime); i++) { lista_intrari.Add(Console.ReadLine()); } foreach (var item in lista_intrari) { var input = item + "$"; stiva = new Stack <string>(); actions = new List <string>(); stiva.Push("0"); while (input != "") { var linie = int.Parse(stiva.Peek()); var coloana = All_Symbols.IndexOf(input[0].ToString()); var elem = MatrixTable[linie][coloana]; actions.Add(elem); if (elem.Equals("*")) { Console.WriteLine("Eroare"); break; } else if (elem[0].ToString().Equals("s")) { stiva.Push(All_Symbols[coloana]); stiva.Push(elem.Substring(1)); input = input.Substring(1); } else if (elem[0].ToString().Equals("r")) { var before_Add = ""; var after_r = int.Parse(elem.Substring(1)); var grammer = Dictionary_Grammer[after_r - 1]; var left = grammer.Split('>')[0].ToString(); var right = grammer.Split('>')[1].ToString(); var eliminate_number = right.Length * 2; for (int i = 0; i < eliminate_number; i++) { stiva.Pop(); } before_Add = stiva.Peek(); stiva.Push(left); var linie_p = int.Parse(before_Add); var coloana_p = All_Symbols.IndexOf(stiva.Peek().ToString()); var elem_p = MatrixTable[linie_p][coloana_p]; actions.Add(elem_p); stiva.Push(elem_p); } else if (elem.Equals("acc")) { Console.WriteLine("Acceptat"); foreach (var item2 in actions) { Console.Write(item2 + " "); } Console.WriteLine(); break; } } } } else { Console.WriteLine("Nu este gramatica data de LR(1)"); } Console.ReadKey(); }
private static void Create_I0(string s, Graf g, int contor = 0, bool reset_parcurs = false) { if (reset_parcurs == false) { for (int i = 0; i < parcurs.Count; i++) { parcurs[i] = false; } } if (contor == 0) { //s='S'>.S,$' //List<string> generated = new List<string>(); List <string> firstAfterDotProductions = new List <string>(); var firstAfterDot = s.Split('.')[1][0].ToString(); //S var afterDot = s.Split('.')[1].ToString(); var afterComma = s.Split(',')[1].ToString(); var items = Dictionary_Grammer.Where(elem => elem.Value[0].ToString().Equals(firstAfterDot)); foreach (var item in items) { var left = item.Value[0].ToString(); var right = item.Value.Split('>')[1]; //generated.Add(left + ">." + right + ","); if (firstAfterDot.Equals(right[0].ToString())) { firstAfterDotProductions.Add(right.Substring(1)); } } //string lookahead = first(afterDot.Substring(1).Replace(",","")); string lookahead = String.Empty; if (!afterDot[1].ToString().Equals(",")) { lookahead = first(afterDot.Substring(1).Split(',')[0]); if (lookahead.Equals("")) { lookahead = afterComma; } } else { lookahead = afterComma; } foreach (var i in firstAfterDotProductions) { lookahead += '/' + first(i); } var result2 = lookahead.Replace("/", "").Distinct(); string result3 = string.Empty; foreach (var i in result2) { result3 += "/" + i.ToString(); } lookahead = result3.Substring(1); foreach (var item in items) { var left = item.Value[0].ToString(); var right = item.Value.Split('>')[1]; g.Lista_noduri.Add(left + ">." + right + ',' + lookahead); if (left.Equals(right[0].ToString())) { var el = left + ">" + right; var poz = Grammer.IndexOf(Grammer.Where(elem => elem.Equals(el)).FirstOrDefault()); if (parcurs[poz] == false) { parcurs[poz] = true; Create_I0(left + ">." + right + ',' + lookahead, g, 1, true); } } else { var el = left + ">" + right; var poz = Grammer.IndexOf(Grammer.Where(elem => elem.Equals(el)).FirstOrDefault()); if (parcurs[poz] == false) { parcurs[poz] = true; Create_I0(left + ">." + right + ',' + lookahead, g, 0, true); } } } } }