//后序遍历生成NFA public static void GetNFA(Node root, Dictionary <Node, FA> dic) { if (root != null && root.lChild != null) { GetNFA(root.lChild, dic); } if (root != null && root.rChild != null) { GetNFA(root.rChild, dic); } if (root != null) { Console.WriteLine(root.value); if (root.IfIsLeaf()) { FA fa = new FA(); Vertex x = new Vertex(); Vertex y = new Vertex(); Arc arc = new Arc(y, (TRANSFER_CHARACTER)Enum.ToObject(typeof(TRANSFER_CHARACTER), root.value)); x.AddArc(arc); fa.headVerList.Add(x); fa.headVerList.Add(y); fa.startVertex = x; fa.endVertex = y; dic.Add(root, fa); } else { if (root.rChild == null) { FA fa = FA.GetNewFAByOlds(dic[root.lChild], null, root.GetValueTypeConcrete()); dic.Add(root, fa); } else { FA fa = FA.GetNewFAByOlds(dic[root.lChild], dic[root.rChild], root.GetValueTypeConcrete()); dic.Add(root, fa); } } } }
public static FA GetNewFAByOlds(FA fa1, FA fa2, VALUE_TYPE_CONCRETE value_type_concrete) { if (fa1 == null && fa2 == null) { return(null); } if (value_type_concrete.Equals(VALUE_TYPE_CONCRETE.VALUE_TYPE_CONCRETE_LIANJIE)) { Arc arc = new Arc(fa2.startVertex, TRANSFER_CHARACTER.TRANSFER_CHARACTER_EPSILON); fa1.endVertex.AddArc(arc); fa2.startVertex = null; fa1.endVertex = fa2.endVertex; fa1.headVerList.AddRange(fa2.headVerList); return(fa1); } else if (value_type_concrete.Equals(VALUE_TYPE_CONCRETE.VALUE_TYPE_CONCRETE_HUO)) { Vertex newStart = new Vertex(); Vertex newEnd = new Vertex(); Arc arc1 = new Arc(fa1.startVertex, TRANSFER_CHARACTER.TRANSFER_CHARACTER_EPSILON); Arc arc2 = new Arc(fa2.startVertex, TRANSFER_CHARACTER.TRANSFER_CHARACTER_EPSILON); Arc arc3 = new Arc(newEnd, TRANSFER_CHARACTER.TRANSFER_CHARACTER_EPSILON); Arc arc4 = new Arc(newEnd, TRANSFER_CHARACTER.TRANSFER_CHARACTER_EPSILON); newStart.AddArc(arc1); newStart.AddArc(arc2); fa1.endVertex.AddArc(arc3); fa2.endVertex.AddArc(arc4); fa1.headVerList.Add(newStart); fa2.headVerList.Add(newEnd); fa1.startVertex = newStart; fa1.endVertex = newEnd; fa1.headVerList.AddRange(fa2.headVerList); return(fa1); } else if (value_type_concrete.Equals(VALUE_TYPE_CONCRETE.VALUE_TYPE_CONCRETE_BIBAO)) { if (fa1 == null) { return(null); } if (fa2 != null) { return(null); } Vertex newStart = new Vertex(); Vertex newEnd = new Vertex(); Arc arc1 = new Arc(fa1.startVertex, TRANSFER_CHARACTER.TRANSFER_CHARACTER_EPSILON); Arc arc2 = new Arc(newEnd, TRANSFER_CHARACTER.TRANSFER_CHARACTER_EPSILON); Arc arc3 = new Arc(newEnd, TRANSFER_CHARACTER.TRANSFER_CHARACTER_EPSILON); Arc arc4 = new Arc(fa1.startVertex, TRANSFER_CHARACTER.TRANSFER_CHARACTER_EPSILON); fa1.headVerList.Add(newStart); fa1.headVerList.Add(newEnd); newStart.AddArc(arc1); newStart.AddArc(arc2); fa1.endVertex.AddArc(arc3); fa1.endVertex.AddArc(arc4); fa1.startVertex = newStart; fa1.endVertex = newEnd; return(fa1); } else { return(null); } return(null); }
public SDFA(FA fa) { this.fa = fa; }
public NFA(FA fa) { this.fa = fa; }