private static Transition updateTransition(Transition t, char openDelimiter, char closeDelimiter) { Transition updated = null; if (t is RuleTransition) { return(null); } else if (t is AtomTransition) { AtomTransition atomTransition = (AtomTransition)t; int newLabel; if (atomTransition.label == OpenDelimiterPlaceholder) { newLabel = openDelimiter; } else if (atomTransition.label == CloseDelimiterPlaceholder) { newLabel = closeDelimiter; } else { return(null); } updated = new AtomTransition(t.target, newLabel); } else if (t is NotSetTransition) { NotSetTransition notSetTransition = (NotSetTransition)t; int removeLabel; int addLabel; if (notSetTransition.set.Contains(OpenDelimiterPlaceholder)) { removeLabel = OpenDelimiterPlaceholder; addLabel = openDelimiter; } else if (notSetTransition.set.Contains(CloseDelimiterPlaceholder)) { removeLabel = CloseDelimiterPlaceholder; addLabel = closeDelimiter; } else { return(null); } IntervalSet set = new IntervalSet(notSetTransition.set); set.Remove(removeLabel); set.Add(addLabel); set.SetReadonly(true); updated = new NotSetTransition(t.target, set); } else if (t is SetTransition) { SetTransition setTransition = (SetTransition)t; int removeLabel; int addLabel; if (setTransition.set.Contains(OpenDelimiterPlaceholder)) { removeLabel = OpenDelimiterPlaceholder; addLabel = openDelimiter; } else if (setTransition.set.Contains(CloseDelimiterPlaceholder)) { removeLabel = CloseDelimiterPlaceholder; addLabel = closeDelimiter; } else { return(null); } IntervalSet set = new IntervalSet(setTransition.set); set.Remove(removeLabel); set.Add(addLabel); set.SetReadonly(true); updated = createSetTransition(t.target, set); } else if (t is RangeTransition) { RangeTransition rangeTransition = (RangeTransition)t; int removeLabel; int addLabel; if (rangeTransition.from <= OpenDelimiterPlaceholder && rangeTransition.to >= OpenDelimiterPlaceholder) { removeLabel = OpenDelimiterPlaceholder; addLabel = openDelimiter; } else if (rangeTransition.from <= CloseDelimiterPlaceholder && rangeTransition.to >= CloseDelimiterPlaceholder) { removeLabel = CloseDelimiterPlaceholder; addLabel = closeDelimiter; } else { return(null); } IntervalSet set = IntervalSet.Of(rangeTransition.from, rangeTransition.to); set.Remove(removeLabel); set.Add(addLabel); set.SetReadonly(true); updated = createSetTransition(t.target, set); } return(updated); }