Esempio n. 1
0
 public void Add(CharClassSet set, bool invert = false)
 {
     Positives = Positives.Concat(!invert ? set.Positives : set.Negatives);
     Negatives = Negatives.Concat(!invert ? set.Negatives : set.Positives);
 }
Esempio n. 2
0
            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);
                }
            }
Esempio n. 3
0
 public CharClassSet(CharClassSet set, bool invert = false) : this()
 {
     Add(set, invert);
 }