Пример #1
0
        //后序遍历生成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);
                    }
                }
            }
        }
Пример #2
0
        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);
        }
Пример #3
0
 public SDFA(FA fa)
 {
     this.fa = fa;
 }
Пример #4
0
 public NFA(FA fa)
 {
     this.fa = fa;
 }