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; } } } } } } }