private void ContainsEpsilonForLR(int stat_number)
        {
            //agar dar yek halat ghanuni dashtim bashim ke be epsilon bere mesle
            //A-> epsilon dar in surat chun epsilon token nist in ghanun hatman bayad be surate
            //kaheshi zaher beshe bana bar in bayad ye rast az rush rad shim

            //Chun epsilon jozve list token haye ma nist bana bar in tu tabee CreateSLRTable dakhele
            //halghe haye for in ghanun ha zaher nemishan bana bar in bayad ba ye tabe joda mohasebe beshan

            foreach (var rl in DFA.stats[stat_number].Statements)
            {
                int number = -1;
                if (rl.Right.Right == "epsilon")
                {
                    number = rl.Right.Number;
                }
                else
                {
                    continue;
                }

                //be ezaye follow haye ghanun reduce mikonim
                foreach (var tk in Terminals)
                {
                    SLRTableCell value = new SLRTableCell();

                    //yani agar ghanun be surate A -> epsilon. bud
                    //bayad be ezaye follow haye A reduce konim
                    value.Number = new List <string>();
                    value.Action = new List <SLRTableCell.Type>();

                    SLRTableKey key = new SLRTableKey();
                    key.statNumber = stat_number;
                    key.Token      = tk;

                    value.Number.Add(number.ToString());
                    value.Action.Add(SLRTableCell.Type.REDUCE);
                    value.isEpsilon = true;


                    if (!Table.ContainsKey(key))
                    {
                        Table.Add(key, value);        //Agar be ezaye yek halat chand ta Action dashte bashim
                                                      //nabayad mostaghim value ro add koniom chun unvaght hame ro ba ham add mikone
                    }

                    else
                    {
                        //bayad check konim tekrari add nakonim

                        if (!ContainsKeyValue(key, value))
                        {
                            Table[key].Action.Add(value.Action[value.Action.Count - 1]);
                            Table[key].Number.Add(value.Number[value.Action.Count - 1]);
                        }
                    }
                }
            }
        }
 bool ContainsKeyValue(SLRTableKey key, SLRTableCell cell)
 {
     if (!Table.ContainsKey(key))
     {
         return(false);
     }
     if (Table[key].Action.Count == 0)
     {
         return(false);
     }
     for (int i = 0; i < Table[key].Action.Count; i++)
     {
         if (Table[key].Action[i] == cell.Action[0])
         {
             if (Table[key].Number[i] == cell.Number[0])
             {
                 return(true);
             }
         }
     }
     return(false);
 }
        private void CreateSLRTable()
        {
            //Aval taklif halat haiy ke be espilon miran ro malum mikonim
            //chun epsilon token nist va be ezaye epsilon ham jaiy nemirim va
            //hich vaght ba epsilon be jaiy shift ham nemikonim pas in halat ha hamashun elzaman
            //faghat dar DFA.state[0] hastan va dg niazi nist baghie state ha ro donabelshun begardim


            for (int i = 0; i < DFA.stats.Count; i++)
            {
                ContainsEpsilon(i);
                for (int j = 0; j < Tokens.Count; j++)
                {
                    SLRTableKey  key   = new SLRTableKey();
                    SLRTableCell value = new SLRTableCell();
                    value.Action = new List <SLRTableCell.Type>();
                    value.Number = new List <string>();

                    //Key ro darim dorost mikonoim
                    key.statNumber = DFA.stats[i].State_Number;//shomare halat ha az 0 shuru mishe
                    key.Token      = Tokens[j];

                    if (DFA.stats[i].next_pointers.ContainsKey(key.Token) || DFA.stats[i].next_pointers.Count == 0)
                    {
                        //Tashkhise inke halate Shift e ya Reduce (ya har 2)
                        var result = defineCellType(DFA.stats[i], Tokens[j]);
                        value.Action = result.type;

                        if (value.Action.Count == 0)
                        {
                            if (!Table.ContainsKey(key))
                            {
                                Table.Add(key, value);
                            }
                        }
                        for (int k = 0; k < value.Action.Count; k++)
                        {
                            if (value.Action[k] == SLRTableCell.Type.SHIFT)
                            {
                                value.Number.Add(DFA.stats[i].next_pointers[key.Token].State_Number.ToString());
                                if (!Table.ContainsKey(key))
                                {
                                    var tmpValue = new SLRTableCell();
                                    tmpValue.Action = new List <SLRTableCell.Type>();
                                    tmpValue.Number = new List <string>();
                                    tmpValue.Action.Add(value.Action[k]);
                                    tmpValue.Number.Add(value.Number[k]);

                                    Table.Add(key, tmpValue); //Agar be ezaye yek halat chand ta Action dashte bashim
                                                              //nabayad mostaghim value ro add koniom chun unvaght hame ro ba ham add mikone
                                }

                                else
                                {
                                    SLRTableCell cell = new SLRTableCell();
                                    cell.Action.Add(value.Action[k]);
                                    cell.Number.Add(value.Number[k]);
                                    if (!ContainsKeyValue(key, cell))
                                    {
                                        if (!Table.ContainsValue(cell))
                                        {
                                            Table[key].Action.Add(cell.Action[0]);
                                            Table[key].Number.Add(cell.Number[0]);
                                        }
                                    }
                                }
                            }
                            else if (value.Action[k] == SLRTableCell.Type.REDUCE)

                            {
                                value.Number.Add(result.RightSide[k].Number.ToString());

                                //hala ke fahmidim be koja mirim bayad be ezaye majmue follow e ghanun reduce ro anjam bedim
                                //aval bayad follow haye un ghanun ro peida konoim

                                string tokenBackUp = key.Token;
                                foreach (var flws in Grammer[result.RightSide[k].Left].Follows)
                                {
                                    key.Token = flws;

                                    if (!Table.ContainsKey(key))
                                    {
                                        var tmpValue = new SLRTableCell();
                                        tmpValue.Action = new List <SLRTableCell.Type>();
                                        tmpValue.Number = new List <string>();
                                        tmpValue.Action.Add(value.Action[k]);
                                        tmpValue.Number.Add(value.Number[k]);

                                        Table.Add(key, tmpValue);    //Agar be ezaye yek halat chand ta Action dashte bashim
                                        //nabayad mostaghim value ro add koniom chun unvaght hame ro ba ham add mikone
                                    }

                                    else
                                    {
                                        SLRTableCell cell = new SLRTableCell();
                                        cell.Action.Add(value.Action[k]);
                                        cell.Number.Add(value.Number[k]);
                                        if (!ContainsKeyValue(key, cell))
                                        {
                                            Table[key].Action.Add(cell.Action[0]);
                                            Table[key].Number.Add(cell.Number[0]);
                                        }
                                    }
                                }
                                key.Token = tokenBackUp;    //restoring the back up after finishing
                            }
                        }
                    }
                }
            }

            //Hala ke kar tamum shode bayad halate khateme ro malum konim
            //State 1 be ezaye $ mishe halate accept
            SLRTableKey  key2   = new SLRTableKey();
            SLRTableCell value2 = new SLRTableCell();

            value2.Action = new List <SLRTableCell.Type>();
            value2.Number = new List <string>();
            value2.Action.Add(SLRTableCell.Type.ACCEPT);
            value2.Number.Add("1");
            key2.Token      = "$";
            key2.statNumber = 1;

            Table[key2] = value2;
        }
        private void CreateLRTable()
        {
            //Aval taklif halat haiy ke be espilon miran ro malum mikonim
            //Chun epsilon token nist pas dar Tokens vojud nadare bayad jodagane hesab beshe
            for (int i = 0; i < DFA.stats.Count; i++)
            {
                ContainsEpsilonForLR(i);
                for (int j = 0; j < Tokens.Count; j++)
                {
                    SLRTableKey  key   = new SLRTableKey();
                    SLRTableCell value = new SLRTableCell();
                    value.Action = new List <SLRTableCell.Type>();
                    value.Number = new List <string>();

                    //Key ro darim dorost mikonoim
                    key.statNumber = DFA.stats[i].State_Number;//shomare halat ha az 0 shuru mishe
                    key.Token      = Tokens[j];

                    if (DFA.stats[i].next_pointers.ContainsKey(key.Token) || DFA.stats[i].next_pointers.Count == 0)
                    {
                        var result = defineCellType(DFA.stats[i], Tokens[j]);
                        value.Action = result.type;

                        if (value.Action.Count == 0)
                        {
                            if (!Table.ContainsKey(key))
                            {
                                Table.Add(key, value);
                            }
                        }
                        for (int k = 0; k < value.Action.Count; k++)
                        {
                            if (value.Action[k] == SLRTableCell.Type.SHIFT)
                            {
                                value.Number.Add(DFA.stats[i].next_pointers[key.Token].State_Number.ToString());
                                if (!Table.ContainsKey(key))
                                {
                                    var tmpValue = new SLRTableCell();
                                    tmpValue.Action = new List <SLRTableCell.Type>();
                                    tmpValue.Number = new List <string>();
                                    tmpValue.Action.Add(value.Action[k]);
                                    tmpValue.Number.Add(value.Number[k]);

                                    Table.Add(key, tmpValue); //Agar be ezaye yek halat chand ta Action dashte bashim
                                                              //nabayad mostaghim value ro add koniom chun unvaght hame ro ba ham add mikone
                                }

                                else
                                {
                                    SLRTableCell cell = new SLRTableCell();
                                    cell.Action.Add(value.Action[k]);
                                    cell.Number.Add(value.Number[k]);
                                    if (!ContainsKeyValue(key, cell))
                                    {
                                        if (!Table.ContainsValue(cell))
                                        {
                                            Table[key].Action.Add(cell.Action[0]);
                                            Table[key].Number.Add(cell.Number[0]);
                                        }
                                    }
                                }
                            }
                            else if (value.Action[k] == SLRTableCell.Type.REDUCE)

                            {
                                value.Number.Add(result.RightSide[k].Number.ToString());

                                //hala ke fahmidim be koja mirim bayad be ezaye majmue follow e ghanun reduce ro anjam bedim
                                //aval bayad follow haye un ghanun ro peida konoim
                                string tokenBackUp = key.Token;

                                foreach (var tk in Terminals)
                                {
                                    key.Token = tk;


                                    if (!Table.ContainsKey(key))
                                    {
                                        var tmpValue = new SLRTableCell();
                                        tmpValue.Action = new List <SLRTableCell.Type>();
                                        tmpValue.Number = new List <string>();
                                        tmpValue.Action.Add(value.Action[k]);
                                        tmpValue.Number.Add(value.Number[k]);

                                        Table.Add(key, tmpValue); //Agar be ezaye yek halat chand ta Action dashte bashim
                                                                  //nabayad mostaghim value ro add koniom chun unvaght hame ro ba ham add mikone
                                    }

                                    else
                                    {
                                        SLRTableCell cell = new SLRTableCell();
                                        cell.Action.Add(value.Action[k]);
                                        cell.Number.Add(value.Number[k]);
                                        if (!ContainsKeyValue(key, cell))
                                        {
                                            Table[key].Action.Add(cell.Action[0]);
                                            Table[key].Number.Add(cell.Number[0]);
                                        }
                                    }
                                }
                                key.Token = tokenBackUp;//restoring the back up after finishing
                            }
                        }
                    }
                }
            }
            //Hala ke kar tamum shode bayad halate khateme ro malum konim
            //State 1 be ezaye $ mishe halate accept
            SLRTableKey  key2   = new SLRTableKey();
            SLRTableCell value2 = new SLRTableCell();

            value2.Action = new List <SLRTableCell.Type>();
            value2.Number = new List <string>();
            value2.Action.Add(SLRTableCell.Type.ACCEPT);
            value2.Number.Add("1");
            key2.Token      = "$";
            key2.statNumber = 1;

            Table[key2] = value2;
        }