Exemplo n.º 1
0
        private bool AddRecursivePopTransitions([NotNull] HashSet <State> visited, [NotNull] State currentState, Transition effectiveTransition, [NotNull] List <int> contexts, StateOptimizer optimizer)
        {
            Debug.Assert(visited != null);
            Debug.Assert(currentState != null);
            Debug.Assert(contexts != null);

            bool foundRecursive = false;

            foreach (var transition in currentState.OutgoingTransitions.Where(i => !i.IsRecursive && (i.IsEpsilon || (i is PopContextTransition))).ToArray())
            {
                ContextTransition contextTransition = transition as ContextTransition;
                try
                {
                    if (contextTransition != null)
                    {
                        contexts.AddRange(contextTransition.ContextIdentifiers);
                    }

                    if (transition.TargetState == this)
                    {
                        foundRecursive = true;

                        if (contexts.Count == 0)
                        {
                            Trace.WriteLine(string.Format("State {0} is self-recursive.", this.Id));
                            continue;
                        }

                        PopContextTransition recursive = new PopContextTransition(this, contexts);
                        recursive.IsRecursive = true;
                        AddTransitionInternal(recursive, optimizer);
                        continue;
                    }

                    if (!visited.Add(transition.TargetState))
                    {
                        continue;
                    }

                    try
                    {
                        AddRecursivePopTransitions(visited, transition.TargetState, MergeTransitions(effectiveTransition, transition), contexts, optimizer);
                    }
                    finally
                    {
                        visited.Remove(transition.TargetState);
                    }
                }
                finally
                {
                    if (contextTransition != null)
                    {
                        contexts.RemoveRange(contexts.Count - contextTransition.ContextIdentifiers.Count, contextTransition.ContextIdentifiers.Count);
                    }
                }
            }

            return(foundRecursive);
        }
Exemplo n.º 2
0
        public override bool Equals(object obj)
        {
            ContextTransition other = obj as ContextTransition;

            if (other == null)
            {
                return(false);
            }

            if (object.ReferenceEquals(other, this))
            {
                return(true);
            }

            return(base.Equals(other) &&
                   ContextIdentifiers.SequenceEqual(other.ContextIdentifiers));
        }
Exemplo n.º 3
0
        private static string GetTransitionLabel(Transition transition, IList <string> tokenNames)
        {
            if (transition.IsEpsilon)
            {
                return(string.Empty);
            }

            ContextTransition contextTransition = transition as ContextTransition;

            if (contextTransition != null)
            {
                string type    = transition is PushContextTransition ? "push" : "pop";
                string context = string.Join(" ", contextTransition.ContextIdentifiers);

                //string sourceSet = transition.SourceState.IsOptimized ? transition.SourceState.GetSourceSet(preventContextType) : transition.SourceState.GetSourceSet();

                return(string.Format("{0} {1}", type, context));
            }

            return(transition.MatchSet.ToString(tokenNames));
        }