Example #1
0
        private int traverseStates(string word)
        {
            Queue <RegularState> queue   = new Queue <RegularState>(states);
            Set <RegularState>   visited = new Set <RegularState>();

            states.Clear();
            while (queue.Count > 0)
            {
                RegularState state = queue.Dequeue();
                hasGreedyEnd = state.isGreedyEnd();
                if (hasGreedyEnd)
                {
                    return(0);
                }
                visited.Add(state);
                foreach (RegularTransition rt in state.getOutTransitions())
                {
                    if (rt.isEmpty())
                    {
                        RegularState rst = rt.getEndState();
                        if (!queue.Contains(rst) && !visited.Contains(rst))
                        {
                            queue.Enqueue(rst);
                        }
                    }
                    else if (rt.match(word))
                    {
                        addState(rt.getEndState());
                    }
                }
            }
            return(states.Count);
        }
Example #2
0
            /// <summary>
            /// Replace end states in all transitions starting from base
            /// </summary>
            /// <param name="instat"></param>
            /// <param name="from"></param>
            /// <param name="to"></param>
            private static void replaceStates(RegularState instat, RegularState from, RegularState to)
            {
                Stack <RegularState> states = new Stack <RegularState>();

                states.Push(instat);
                Set <RegularState> visited = new Set <RegularState>();

                visited.Add(to);
                while (states.Count > 0)
                {
                    RegularState state = states.Pop();
                    visited.Add(state);
                    foreach (RegularTransition rt in state.getOutTransitions())
                    {
                        if (rt.getEndState().Equals(from))
                        {
                            rt.setEndState(to);
                            continue;
                        }

                        RegularState st = rt.getEndState();
                        if (!visited.Contains(st))
                        {
                            states.Push(st);
                        }
                    }
                }
            }
Example #3
0
        private void addState(RegularState state)
        {
            if (states.Contains(state))
            {
                return;
            }
            states.Add(state);

            // add lambda transitions
            foreach (RegularTransition rt in state.getOutTransitions())
            {
                if (rt.isEmpty())
                {
                    addState(rt.getEndState());
                }
            }
        }
Example #4
0
            /// <summary>
            /// Return true when the provided state has a path to itself
            /// </summary>
            /// <param name="self"></param>
            /// <returns></returns>
            private static bool hasSelfReference(RegularState self)
            {
                Stack <RegularState> states = new Stack <RegularState>();

                states.Push(self);
                Set <RegularState> visited = new Set <RegularState>();

                while (states.Count > 0)
                {
                    RegularState state = states.Pop();
                    visited.Add(state);
                    foreach (RegularTransition rt in state.getOutTransitions())
                    {
                        if (rt.getEndState().Equals(self))
                        {
                            return(true);
                        }
                    }
                }
                return(false);
            }