Exemple #1
0
 public void Evaluate(int start, int end, FSA <TValue> fsa, AstNodeBase node, ORegexOptions options)
 {
     // ReSharper disable once CanBeReplacedWithTryCastAndCheckForNull
     if (node is AstAtomNode <TValue> )
     {
         EvaluateAtom(start, end, fsa, (AstAtomNode <TValue>)node);
     }
     else if (node is AstConcatNode)
     {
         EvaluateConcat(start, end, fsa, (AstConcatNode)node, options);
     }
     else if (node is AstOrNode)
     {
         EvaluateOr(start, end, fsa, (AstOrNode)node, options);
     }
     else if (node is AstRepeatNode)
     {
         EvaluateRepeat(start, end, fsa, (AstRepeatNode)node, options);
     }
     else if (node is AstRootNode)
     {
         EvaluateRoot(start, end, fsa, (AstRootNode)node, options);
     }
     else
     {
         throw new NotImplementedException(node.GetType().Name);
     }
 }
Exemple #2
0
        private void EvaluateLook(
            int start,
            int end,
            FSA <TValue> fsa,
            LookAheadQuantifier quantifier,
            AstConcatNode concatNode,
            ORegexOptions options)
        {
            bool isBehind   = options.HasFlag(ORegexOptions.ReversePattern) ? !quantifier.IsBehind : quantifier.IsBehind;
            bool isNegative = quantifier.IsNegative;

            var condOptions = isBehind ? ORegexOptions.RightToLeft : ORegexOptions.None;
            var concat      = new AstConcatNode(concatNode.Children, concatNode.Range);
            var root        = new AstRootNode(concat,
                                              true,
                                              false,
                                              concat.Range,
                                              new[]
            {
                ORegexAstFactory <TValue> .MainCaptureName
            });
            var fa     = Create(root, condOptions);
            var oregex = new ORegex <TValue>(fa, condOptions);

            var func = new ORegexPredicateEdge <TValue>("#look", oregex, isNegative, isBehind);

            EvaluateCondition(start, end, fsa, func);
        }
Exemple #3
0
        public FiniteAutomaton <TValue> Create(AstRootNode root, ORegexOptions options)
        {
            var nfa = CreateRawFsa(root, options);

            if (options.HasFlag(ORegexOptions.ReversePattern))
            {
                nfa = _fsaOperator.ReverseFsa(nfa);
            }
            var dfa = _fsaOperator.MinimizeFsa(nfa);

            return(new FiniteAutomaton <TValue>(new CFSA <TValue>(dfa), new CFSA <TValue>(nfa)));
        }
Exemple #4
0
        public FSA <TValue> CreateRawFsa(AstRootNode root, ORegexOptions options)
        {
            var result = new FSA <TValue>(root.CaptureGroupNames[0])
            {
                CaptureNames = root.CaptureGroupNames
            };
            var start = result.NewState();
            var end   = result.NewState();

            Evaluate(start, end, result, root, options);
            result.AddFinal(end);
            result.AddStart(start);
            return(result);
        }
Exemple #5
0
        public void BuildTest(int iterCount, ORegexOptions options)
        {
            const string input =
                @"  ^
			        {a}(?<group1>{a})
                    | {a}{a}*?
                    | ({a}{a}({a})?)

                    ///i write some regex
                    /*asdfsdf*/

                    | [{a}{a}]
                    | [^{a}{a}]
                    | (?<={a})
                    | .
                    | {a}{2,}
                    | {a}{2,3}?
                    $";
            for (int i = 0; i < iterCount; i++)
            {
                _compiler.Build(input, _table, options);
            }
        }
Exemple #6
0
        public void BuildTest(int iterCount, ORegexOptions options)
        {
            const string input =
                @"  ^
			        {a}(?<group1>{a})
                    | {a}{a}*?
                    | ({a}{a}({a})?)

                    ///i write some regex
                    /*asdfsdf*/

                    | [{a}{a}]
                    | [^{a}{a}]
                    | (?<={a})
                    | .
                    | {a}{2,}
                    | {a}{2,3}?
                    $";

            for (int i = 0; i < iterCount; i++)
            {
                _compiler.Build(input, _table, options);
            }
        }
Exemple #7
0
        private void EvaluateRepeat(int start, int end, FSA <TValue> fsa, AstRepeatNode astRepeatNode, ORegexOptions options)
        {
            var toRepeat = astRepeatNode.Argument;
            var prev     = start;

            for (int i = 0; i < astRepeatNode.MinCount; i++)
            {
                var next = CreateNewState(fsa);
                Evaluate(prev, next, fsa, toRepeat, options);
                prev = next;
            }

            if (astRepeatNode.MaxCount == int.MaxValue)
            {
                RepeatZeroOrInfinite(prev, end, fsa, toRepeat, astRepeatNode.IsLazy, options);
            }
            else
            {
                int count = astRepeatNode.MaxCount - astRepeatNode.MinCount - 1;
                int next;
                for (int i = 0; i < count; i++)
                {
                    next = CreateNewState(fsa);
                    RepeatZeroOrOne(prev, next, fsa, toRepeat, astRepeatNode.IsLazy, options);
                    prev = next;
                }
                next = end;
                RepeatZeroOrOne(prev, next, fsa, toRepeat, astRepeatNode.IsLazy, options);
            }
        }
Exemple #8
0
 private void EvaluateRoot(int start, int end, FSA <TValue> fsa, AstRootNode astRootNode, ORegexOptions options)
 {
     fsa.ExactBegin = astRootNode.MatchBegin;
     fsa.ExactEnd   = astRootNode.MatchEnd;
     Evaluate(start, end, fsa, astRootNode.Regex, options);
 }
Exemple #9
0
        private void EvaluateConcat(int start, int end, FSA <TValue> fsa, AstConcatNode node, ORegexOptions options)
        {
            var group = node as AstGroupNode;

            if (group != null)
            {
                if (group.Quantifier != null)
                {
                    // ReSharper disable once CanBeReplacedWithTryCastAndCheckForNull
                    if (group.Quantifier is CaptureQuantifier)
                    {
                        var captureQ = (CaptureQuantifier)group.Quantifier;
                        var sys      = new SystemPredicateEdge <TValue>("#capture")
                        {
                            IsCapture   = true,
                            CaptureName = captureQ.CaptureName,
                            CaptureId   = captureQ.CaptureId
                        };

                        var startTmp = CreateNewState(fsa);
                        fsa.AddTransition(start, sys, startTmp);
                        start = startTmp;
                        var endTmp = CreateNewState(fsa);
                        fsa.AddTransition(endTmp, sys, end);
                        end = endTmp;
                    }
                    else if (group.Quantifier is LookAheadQuantifier)
                    {
                        var lookQ = (LookAheadQuantifier)group.Quantifier;
                        EvaluateLook(start, end, fsa, lookQ, group, options);
                        return;
                    }
                }
            }

            var prev = start;
            int next;
            var children = node.GetChildren().ToArray();

            for (int i = 0; i < children.Length - 1; i++)
            {
                next = CreateNewState(fsa);
                Evaluate(prev, next, fsa, children[i], options);
                prev = next;
            }
            next = end;
            Evaluate(prev, next, fsa, children[children.Length - 1], options);
        }
Exemple #10
0
 public ORegex(string pattern, ORegexOptions options, IEqualityComparer <TValue> comparer, params TValue[] values)
     : this(pattern, options, CreateValuesPredicateTable(values, comparer))
 {
 }
Exemple #11
0
        private void RepeatZeroOrInfinite(int start, int end, FSA <TValue> fsa, AstNodeBase predicate, bool isLasy, ORegexOptions options)
        {
            var tmp = CreateNewState(fsa);

            if (isLasy)
            {
                fsa.AddEpsilonTransition(start, end);
                fsa.AddEpsilonTransition(tmp, end);
                Evaluate(tmp, tmp, fsa, predicate, options);
                fsa.AddEpsilonTransition(start, tmp);
            }
            else
            {
                Evaluate(tmp, tmp, fsa, predicate, options);
                fsa.AddEpsilonTransition(tmp, end);

                fsa.AddEpsilonTransition(start, tmp);
                fsa.AddEpsilonTransition(start, end);
            }
        }
Exemple #12
0
 private void RepeatZeroOrOne(int start, int end, FSA <TValue> fsa, AstNodeBase node, bool isLasy, ORegexOptions options)
 {
     if (isLasy)
     {
         fsa.AddEpsilonTransition(start, end);
         Evaluate(start, end, fsa, node, options);
     }
     else
     {
         Evaluate(start, end, fsa, node, options);
         fsa.AddEpsilonTransition(start, end);
     }
 }
Exemple #13
0
 internal ORegex(IFSA <TValue> finiteAutomaton, ORegexOptions options)
 {
     _fa     = finiteAutomaton.ThrowIfNull();
     Options = options;
     Pattern = "#Internal pattern are not available by default.";
 }
Exemple #14
0
 public ORegex(string pattern, ORegexOptions options, PredicateTable <TValue> table)
 {
     _fa     = Compiler.Build(pattern, table, options);
     Options = options;
     Pattern = pattern;
 }
Exemple #15
0
 public ORegex(string pattern, ORegexOptions options, params Func <TValue, bool>[] predicates) : this(pattern, options, CreatePredicateTable(predicates))
 {
 }
Exemple #16
0
 public DebugORegex(string pattern, ORegexOptions options = ORegexOptions.None) : base(pattern, options, new DebugPredicateTable())
 {
 }
Exemple #17
0
 private void EvaluateOr(int start, int end, FSA <TValue> fsa, AstOrNode node, ORegexOptions options)
 {
     foreach (var child in node.GetChildren())
     {
         Evaluate(start, end, fsa, child, options);
     }
 }
Exemple #18
0
        public IFSA <TValue> Build(string input, PredicateTable <TValue> predicateTable, ORegexOptions options)
        {
            var ast = _parser.Parse(input, predicateTable);
            var fa  = _stb.Create(ast, options);

            return(fa);
        }