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); }
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)); }
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)); }