private void FindEclose(DFAGraphNode <string> node, ref NFAGraphNode <string> rtrn) { Console.WriteLine(node.Name); if (!komar.Contains(node)) { komar.Add(node); bool flagerror = false; for (int i = 0; i < rtrn.GetEntering().Count; i++) { if (node.Name == rtrn.GetEntering()[i].Name) { flagerror = true; } } if (!flagerror) { rtrn.AddEntering(node); } for (int i = 0; i < node.ConversionTable.Count; i++) { if (node.ConversionTable[i].InputCharacter == "ε") { FindEclose(node.ConversionTable[i].StateSet, ref rtrn); } } } }
public Node(DFAGraphNode <string> nodeA, int size = 100) { InitializeComponent(); Size = size; string loop = ""; for (int i = 0; i < nodeA.ConversionTable.Count; i++) { if (nodeA.ConversionTable[i].StateSet.Name == nodeA.Name) { loop += nodeA.ConversionTable[i].InputCharacter + " "; } } if (loop != "") { mArrowArc.Visibility = Visibility.Visible; mLabelArc.Visibility = Visibility.Visible; mLabelArc.Content = loop; } else { mArrowArc.Visibility = Visibility.Hidden; mLabelArc.Visibility = Visibility.Hidden; } Name = nodeA.Name; if ((nodeA.ItIsAdmissibleState == false) && (nodeA.ItIsInitialState == false)) { mOutEllipse.Visibility = Visibility.Collapsed; } else if ((nodeA.ItIsAdmissibleState == true) && (nodeA.ItIsInitialState == false)) { mOutEllipse.Visibility = Visibility.Visible; } else if ((nodeA.ItIsAdmissibleState == false) && (nodeA.ItIsInitialState == true)) { mOutEllipse.Visibility = Visibility.Visible; SolidColorBrush blueBrush = new SolidColorBrush(); blueBrush.Color = Colors.LightGreen; mOutEllipse.Fill = blueBrush; SolidColorBrush strokeBrush = new SolidColorBrush(); strokeBrush.Color = Colors.LightGreen; mOutEllipse.Stroke = strokeBrush; } else if ((nodeA.ItIsAdmissibleState == true) && (nodeA.ItIsInitialState == true)) { mOutEllipse.Visibility = Visibility.Visible; SolidColorBrush blueBrush = new SolidColorBrush(); blueBrush.Color = Colors.LightGreen; mOutEllipse.Fill = blueBrush; } }
private void FindESigma(DFAGraphNode <string> node, string sigma, ref NFAGraphNode <string> rtrn) { komar.Clear(); for (int i = 0; i < node.ConversionTable.Count; i++) { if (node.ConversionTable[i].InputCharacter == sigma) { FindEclose(node.ConversionTable[i].StateSet, ref rtrn); } } }
private void ENFAtoDFA(Automaton automaton) { Automaton DFAdef = new Automaton(automaton.InputCharacters); // automatonGraph = automaton; Queue <NFAGraphNode <string> > queue = new Queue <NFAGraphNode <string> >(); List <string> list = new List <string>(); List <string> newInpetCh = new List <string>(); NFAGraphNode <string> topnode = new NFAGraphNode <string>(true); komar.Clear(); FindEclose(automaton.head, ref topnode); topnode.GetNewNode(); queue.Enqueue(topnode); DFAdef.addState(topnode.GetDFANode()); while (queue.Count > 0) { NFAGraphNode <string> nodeTemp = queue.Dequeue(); if (!list.Contains(nodeTemp.Name)) { List <StateTransitionTable> _conversionTable = new List <StateTransitionTable>(); for (int i = 1; i < automaton.InputCharacters.Count; i++) { NFAGraphNode <string> node = new NFAGraphNode <string>(); Console.WriteLine(automaton.InputCharacters[i]); for (int j = 0; j < nodeTemp.GetEntering().Count; j++) { FindESigma(nodeTemp.GetEntering()[j], automaton.InputCharacters[i], ref node); } if (node.GetEntering().Count > 0) { node.GetNewNode(); DFAGraphNode <string> dfaNode = node.GetDFANode(); if (DFAdef.findByName(dfaNode.Name) == null) { DFAdef.addState(dfaNode); _conversionTable.Add(new StateTransitionTable(dfaNode, automaton.InputCharacters[i], true)); } else { _conversionTable.Add(new StateTransitionTable(DFAdef.findByName(dfaNode.Name), automaton.InputCharacters[i], true)); } queue.Enqueue(node); } } list.Add(nodeTemp.Name); DFAdef.findByName(nodeTemp.Name).ConversionTable = _conversionTable; } } int a = 6; automatonGraph = DFAdef; automatonGraph.findHead(); OutputToCanvas(); }