public void Add(CharClassSet set, bool invert = false) { Positives = Positives.Concat(!invert ? set.Positives : set.Negatives); Negatives = Negatives.Concat(!invert ? set.Negatives : set.Positives); }
public CharClassSet this[Expr expr] { get { var stack = new Stack <StackFrame>(); stack.Push(expr); CharClassSet classSet = null; while (stack.Any()) { var context = stack.Pop(); expr = context.Expr; if (context == null || expr == null) { continue; } else if (context.Children == null) { context.Children = new Queue <Expr>(); if (expr.Factors != null && expr.Factors.Any()) { expr.Factors.ForEach(x => context.Children.Enqueue(x)); } stack.Push(context); continue; } else if (context.Children.Any()) { expr = context.Children.Dequeue(); stack.Push(context); stack.Push(expr); continue; } classSet = null; if (expr.Operator == Op.Term) { if (expr.Term is CharClassSet) { classSet = expr.Term as CharClassSet; } else { classSet = new CharClassSet(expr.Term as Element); } } else if (context.SubSets != null && context.SubSets.Any()) { switch (expr.Operator) { case Op.Tilde: classSet = new CharClassSet { { context.SubSets.First(), Invert } }; break; case Op.Plus: classSet = new CharClassSet { { context.SubSets.First() }, { context.SubSets.Last() } }; break; case Op.Minus: classSet = new CharClassSet { { context.SubSets.First() }, { context.SubSets.Last(), Invert } }; break; } } var parentContext = stack.Any() ? stack.Peek() : null; if (classSet != null && parentContext != null) { parentContext.SubSets.Add(classSet); } } if (classSet == null) { throw new CharClassEvalException(); } return(classSet); } }
public CharClassSet(CharClassSet set, bool invert = false) : this() { Add(set, invert); }