Exemplo n.º 1
0
        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;
        }
Exemplo n.º 2
0
        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();
        }
Exemplo n.º 3
0
        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);
                        }
                    }
                }
            }
        }