internal FSM ImplementFSMCardinality(FSM origFsm, StateNameSource stateNames)
        {
            //Based on the occurence, add *,+, or ? semantics
            Debug.Assert(origFsm != null);
            FSM fsm = null;

            switch (this.OccursInSchema)
            {
            case Occurs.OneOrMore:
                fsm = MakePlusFSM(origFsm, stateNames);
                break;

            case Occurs.ZeroOrMore:
                fsm = MakeStarFSM(origFsm, stateNames);
                break;

            case Occurs.ZeroOrOne:
                fsm = MakeQMarkFSM(origFsm, stateNames);
                break;

            default:
                fsm = origFsm;
                break;
            }

            return(fsm);
        }
Esempio n. 2
0
        internal override FSM MakeFSM(StateNameSource stateNames)
        {
            FSM fsm = null;

            switch (this.contentModelType)
            {
            case Xml.Schema.Linq.ContentModelType.Sequence:
            {
                fsm = this.MakeSequenceFSM(stateNames);
                break;
            }

            case Xml.Schema.Linq.ContentModelType.Choice:
            {
                fsm = this.MakeChoiceFSM(stateNames);
                break;
            }

            default:
            {
                throw new InvalidOperationException();
            }
            }
            return(base.ImplementFSMCardinality(fsm, stateNames));
        }
Esempio n. 3
0
        private FSM MakeChoiceFSM(StateNameSource stateNames)
        {
            FSM       fsm       = null;
            int       fsmStart  = FSM.InvalidState;
            Set <int> fsmAccept = null;

            foreach (ContentInfo child in base.Children)
            {
                FSM currFsm = child.MakeFSM(stateNames);
                if (fsm != null)
                {
                    FSM.CloneTransitions(currFsm, currFsm.Start, fsm, fsmStart);
                    fsm.AddTransitions(currFsm);
                    if (currFsm.isAccept(currFsm.Start))
                    {
                        fsmAccept.Add(fsmStart);
                    }
                    foreach (int state in currFsm.Accept)
                    {
                        fsmAccept.Add(state);
                    }
                }
                else
                {
                    fsm       = currFsm;
                    fsmStart  = currFsm.Start;
                    fsmAccept = currFsm.Accept;
                }
            }
            return(fsm);
        }
Esempio n. 4
0
        private FSM MakeSequenceFSM(StateNameSource stateNames)
        {
            FSM       fsm       = null;
            Set <int> fsmAccept = null;

            foreach (ContentInfo child in base.Children)
            {
                FSM currFsm = child.MakeFSM(stateNames);
                if (fsm != null)
                {
                    int currStart = currFsm.Start;
                    foreach (int oldFinalState in fsmAccept)
                    {
                        FSM.CloneTransitions(currFsm, currStart, fsm, oldFinalState);
                    }
                    fsm.AddTransitions(currFsm);
                    if (!currFsm.Accept.Contains(currStart))
                    {
                        fsmAccept.Clear();
                    }
                    foreach (int state in currFsm.Accept)
                    {
                        fsmAccept.Add(state);
                    }
                }
                else
                {
                    fsm       = currFsm;
                    fsmAccept = currFsm.Accept;
                }
            }
            return(fsm);
        }
Esempio n. 5
0
        internal FSM ImplementFSMCardinality(FSM origFsm, StateNameSource stateNames)
        {
            Debug.Assert(origFsm != null);
            FSM fsm = null;

            switch (this.OccursInSchema)
            {
            case Occurs.ZeroOrOne:
            {
                fsm = this.MakeQMarkFSM(origFsm, stateNames);
                break;
            }

            case Occurs.ZeroOrMore:
            {
                fsm = this.MakeStarFSM(origFsm, stateNames);
                break;
            }

            case Occurs.OneOrMore:
            {
                fsm = this.MakePlusFSM(origFsm, stateNames);
                break;
            }

            default:
            {
                fsm = origFsm;
                break;
            }
            }
            return(fsm);
        }
Esempio n. 6
0
        private FSM MakeStarFSM(FSM origFsm, StateNameSource stateNames)
        {
            int start = origFsm.Start;

            this.TransformToStar(start, start, origFsm, new Set <int>());
            origFsm.Accept.Add(start);
            return(origFsm);
        }
Esempio n. 7
0
        internal int Next()
        {
            StateNameSource stateNameSource = this;
            int             num             = stateNameSource.nextName;
            int             num1            = num;

            stateNameSource.nextName = num + 1;
            return(num1);
        }
        private FSM MakeStarFSM(FSM origFsm, StateNameSource stateNames)
        {
            int       start   = origFsm.Start;
            Set <int> visited = new Set <int>();

            TransformToStar(start, start, origFsm, visited);
            origFsm.Accept.Add(start);

            return(origFsm);
        }
        internal override FSM MakeFSM(StateNameSource stateNames)
        {
            Dictionary <int, Transitions> transitions = new Dictionary <int, Transitions>();
            int start = stateNames.Next();
            int end   = stateNames.Next();

            transitions.Add(start, new Transitions(new SingleTransition(new WildCard(this.Namespaces, this.TargetNamespace), end)));
            FSM fsm = new FSM(start, new Set <int>(end), transitions);

            return(ImplementFSMCardinality(fsm, stateNames));
        }
Esempio n. 10
0
        private FSM MakePlusFSM(FSM origFsm, StateNameSource stateNames)
        {
            int origStart = origFsm.Start;

            foreach (int s in origFsm.Accept)
            {
                if (s != origStart)
                {
                    FSM.CloneTransitions(origFsm, origStart, origFsm, s);
                }
            }
            return(origFsm);
        }
Esempio n. 11
0
 internal override FSM CreateFSM(StateNameSource stateNames)  //Should have only one top-level grouping content info
 {
     foreach (ContentInfo content in Content)
     {
         GroupingInfo group = content as GroupingInfo;
         if (group != null)
         {
             FSM fsm = group.MakeFSM(stateNames);
             return(fsm);
         }
     }
     return(null);
 }
		internal override FSM CreateFSM(StateNameSource stateNames)
		{
			FSM fSM;
			foreach (ContentInfo content in this.Content)
			{
				GroupingInfo group = content as GroupingInfo;
				if (group != null)
				{
					fSM = group.MakeFSM(stateNames);
					return fSM;
				}
			}
			fSM = null;
			return fSM;
		}
        internal override FSM MakeFSM(StateNameSource stateNames)
        {
            FSM fsm = null;

            switch (this.contentModelType)
            {
            case ContentModelType.Sequence:
                fsm = MakeSequenceFSM(stateNames); break;

            case ContentModelType.Choice:
                fsm = MakeChoiceFSM(stateNames); break;

            default:
                throw new InvalidOperationException();
            }

            return(ImplementFSMCardinality(fsm, stateNames));
        }
        private FSM MakeSequenceFSM(StateNameSource stateNames)
        {
            FSM       fsm       = null;
            Set <int> fsmAccept = null;

            foreach (ContentInfo child in Children)
            {
                FSM currFsm = child.MakeFSM(stateNames);

                if (fsm == null)
                {
                    fsm       = currFsm;
                    fsmAccept = currFsm.Accept;
                }
                else
                {
                    int currStart = currFsm.Start;
                    foreach (int oldFinalState in fsmAccept)
                    {
                        FSM.CloneTransitions(currFsm, currStart, fsm, oldFinalState);
                    }

                    fsm.AddTransitions(currFsm);
                    //clear old final states only if the initial state of currFsm is not a final state in currFsm
                    if (!currFsm.Accept.Contains(currStart))
                    {
                        fsmAccept.Clear();
                    }
                    Set <int> currAccept = currFsm.Accept;
                    foreach (int state in currAccept)
                    {
                        fsmAccept.Add(state);
                    }
                }
            }

            return(fsm);
        }
        internal override FSM MakeFSM(StateNameSource stateNames)
        {
            Dictionary <int, Transitions> transitions = new Dictionary <int, Transitions>();
            int         start = stateNames.Next();
            int         end   = stateNames.Next();
            Transitions trans = new Transitions();

            if (!this.IsSubstitutionHead)
            {
                trans.Add(XName.Get(this.schemaName, base.PropertyNs), end);
            }
            else
            {
                foreach (XmlSchemaElement element in this.SubstitutionMembers)
                {
                    trans.Add(XName.Get(element.QualifiedName.Name, element.QualifiedName.Namespace), end);
                }
            }
            transitions.Add(start, trans);
            FSM fSM = base.ImplementFSMCardinality(new FSM(start, new Set <int>(end), transitions), stateNames);

            return(fSM);
        }
        internal override FSM MakeFSM(StateNameSource stateNames)
        {
            //Create a simple fsm with (0,(schemaName,1),{1})
            Dictionary <int, Transitions> transitions = new Dictionary <int, Transitions>();
            int         start = stateNames.Next();
            int         end   = stateNames.Next();
            Transitions trans = new Transitions();

            if (this.IsSubstitutionHead)
            {
                foreach (XmlSchemaElement element in SubstitutionMembers)
                {
                    trans.Add(XName.Get(element.QualifiedName.Name, element.QualifiedName.Namespace), end);
                }
            }
            else
            {
                trans.Add(XName.Get(schemaName, PropertyNs), end);
            }

            transitions.Add(start, trans);
            return(ImplementFSMCardinality(new FSM(start, new Set <int>(end), transitions), stateNames));
        }
        private FSM MakeChoiceFSM(StateNameSource stateNames)
        {
            FSM       fsm       = null;
            int       fsmStart  = FSM.InvalidState;
            Set <int> fsmAccept = null;

            foreach (ContentInfo child in Children)
            {
                FSM currFsm = child.MakeFSM(stateNames);

                if (fsm == null)
                {
                    //first node
                    fsm       = currFsm;
                    fsmStart  = currFsm.Start;
                    fsmAccept = currFsm.Accept;
                }
                else
                {
                    //Merge the start states
                    FSM.CloneTransitions(currFsm, currFsm.Start, fsm, fsmStart);
                    //Copy other transitions
                    fsm.AddTransitions(currFsm);
                    //update final states
                    if (currFsm.isAccept(currFsm.Start))
                    {
                        fsmAccept.Add(fsmStart);
                    }
                    foreach (int state in currFsm.Accept)
                    {
                        fsmAccept.Add(state);
                    }
                }
            }

            return(fsm);
        }
Esempio n. 18
0
 internal virtual FSM CreateFSM(StateNameSource stateNames)
 {
     throw new InvalidOperationException();
 }
Esempio n. 19
0
 private FSM MakeQMarkFSM(FSM origFsm, StateNameSource stateNames)
 {
     origFsm.Accept.Add(origFsm.Start);
     return(origFsm);
 }
 private FSM MakeQMarkFSM(FSM origFsm, StateNameSource stateNames)
 {
     //Change the start state to the final states
     origFsm.Accept.Add(origFsm.Start);
     return(origFsm);
 }