private void LoadNPDA_Click(object sender, EventArgs e)
 {
     NPDA = null;
     try
     {
         NPDA = new NPDA(NPDAPath.Text);
         MessageBox.Show("Your Input Text Parsed and NPDA Generated Successfully", "Success!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
     }
     catch (Exception exception)
     {
         MessageBox.Show(exception.Message, "Failed!", MessageBoxButtons.OK, MessageBoxIcon.Error);
     }
 }
        public CFG(NPDA npda)
        {
            if (npda.FinalStates.Count != 1)
            {
                throw new Exception("Can not convert this NPDA to CFG beacuase it has more than 1 final state!");
            }
            NumberToVariable = new List <string>();
            Transitions      = new List <Tuple <List <char>, List <int>, List <int> > >();
            string leftSide;
            string rightSide1;
            string rightSide2;
            int    indexOfLeftSide;
            int    indexOfRightSide1;
            int    indexOfRightSide2;

            for (int source = 0; source < npda.Transitions.Length; source++)
            {
                var transition = npda.Transitions[source];
                for (int i = 0; i < transition.Item4.Count; i++)
                {
                    if (transition.Item4[i] == "_")
                    {
                        leftSide        = string.Format("(q{0}{1}q{2})", source, transition.Item3[i], transition.Item1[i]);
                        indexOfLeftSide = NumberToVariable.IndexOf(leftSide);
                        if (indexOfLeftSide != -1)
                        {
                            Transitions[indexOfLeftSide].Item1.Add(transition.Item2[i]);
                            Transitions[indexOfLeftSide].Item2.Add(-1);
                            Transitions[indexOfLeftSide].Item3.Add(-1);
                        }
                        else
                        {
                            NumberToVariable.Add(leftSide);
                            indexOfLeftSide = Transitions.Count;
                            Transitions.Add(new Tuple <List <char>, List <int>, List <int> >
                                                (new List <char>(), new List <int>(), new List <int>()));
                            Transitions[indexOfLeftSide].Item1.Add(transition.Item2[i]);
                            Transitions[indexOfLeftSide].Item2.Add(-1);
                            Transitions[indexOfLeftSide].Item3.Add(-1);
                        }
                        if (source == npda.InitialState &&
                            transition.Item3[i] == npda.StackInitialSymbol &&
                            transition.Item1[i] == npda.FinalStates[0]) //We should only have one final state
                        {
                            StartVariable = indexOfLeftSide;
                        }
                    }
                    else
                    {
                        for (int l = 0; l < npda.StateCount; l++)
                        {
                            for (int k = 0; k < npda.StateCount; k++)
                            {
                                leftSide   = string.Format("(q{0}{1}q{2})", source, transition.Item3[i], k);
                                rightSide1 = string.Format("(q{0}{1}q{2})", transition.Item1[i], transition.Item4[i][0], l);
                                rightSide2 = string.Format("(q{0}{1}q{2})", l, transition.Item4[i][1], k);

                                indexOfRightSide1 = NumberToVariable.IndexOf(rightSide1);
                                if (indexOfRightSide1 == -1)
                                {
                                    indexOfRightSide1 = NumberToVariable.Count;
                                    NumberToVariable.Add(rightSide1);
                                    Transitions.Add(new Tuple <List <char>, List <int>, List <int> >
                                                        (new List <char>(), new List <int>(), new List <int>()));
                                }
                                if (source == npda.InitialState &&
                                    transition.Item3[i] == npda.StackInitialSymbol &&
                                    k == npda.FinalStates[0]) //We should only have one final state
                                {
                                    StartVariable = indexOfRightSide1;
                                }

                                indexOfRightSide2 = NumberToVariable.IndexOf(rightSide2);
                                if (indexOfRightSide2 == -1)
                                {
                                    indexOfRightSide2 = NumberToVariable.Count;
                                    NumberToVariable.Add(rightSide2);
                                    Transitions.Add(new Tuple <List <char>, List <int>, List <int> >
                                                        (new List <char>(), new List <int>(), new List <int>()));
                                }
                                if (transition.Item1[i] == npda.InitialState &&
                                    transition.Item4[i][0] == npda.StackInitialSymbol &&
                                    l == npda.FinalStates[0]) //We should only have one final state
                                {
                                    StartVariable = indexOfRightSide2;
                                }

                                indexOfLeftSide = NumberToVariable.IndexOf(leftSide);
                                if (indexOfLeftSide != -1)
                                {
                                    Transitions[indexOfLeftSide].Item1.Add(transition.Item2[i]);
                                    Transitions[indexOfLeftSide].Item2.Add(indexOfRightSide1);
                                    Transitions[indexOfLeftSide].Item3.Add(indexOfRightSide2);
                                }
                                else
                                {
                                    NumberToVariable.Add(leftSide);
                                    Transitions.Add(new Tuple <List <char>, List <int>, List <int> >
                                                        (new List <char>(), new List <int>(), new List <int>()));
                                    Transitions[Transitions.Count - 1].Item1.Add(transition.Item2[i]);
                                    Transitions[Transitions.Count - 1].Item2.Add(indexOfRightSide1);
                                    Transitions[Transitions.Count - 1].Item3.Add(indexOfRightSide2);
                                }
                                if (l == npda.InitialState &&
                                    transition.Item4[i][1] == npda.StackInitialSymbol &&
                                    k == npda.FinalStates[0]) //We should only have one final state
                                {
                                    StartVariable = indexOfLeftSide;
                                }
                            }
                        }
                    }
                }
            }
        }