Esempio n. 1
0
 public static IRunner CompileExpression(this PatternCompiler patternCompiler, string expression)
 {
     return(patternCompiler.Compile(new Pattern("Expression")
     {
         Data = grammar.ParseExpression(expression)
     }));
 }
Esempio n. 2
0
 private static IRunner BuildRunnerFromExpression(PatternCompiler patternCompiler, Operator expression)
 {
     return(patternCompiler.Compile(new Pattern
     {
         Data = new ZeroOrMore(new PrioritizedChoice(new CaptureGroup(0, expression), new Any()))
     }));
 }
Esempio n. 3
0
        public RegexGrammar(PatternCompiler patternCompiler)
        {
            var RE       = new Pattern("RE");
            var simpleRE = new Pattern("SimpleRE");

            var metaCharacter = new Pattern("metaCharacter")
            {
                Data = new PrioritizedChoice(
                    new CharacterClass('*', '+', '^', '$', '|', '(', ')', '[', ']'),
                    new Sequence(new CharacterClass('\\'), new CharacterClass('t', 'n', 'r', 'f', 'b', 'B', 'd', 'D', 's', 'S', 'w', 'W', 'Q', 'U', 'L')),
                    CharacterClass.String(@"*?"),
                    CharacterClass.String(@"+?"),
                    CharacterClass.String(@"$`"),
                    CharacterClass.String(@"$'"),
                    CharacterClass.String(@"$&"),
                    CharacterClass.String(@"\cX"),
                    new Sequence(new CharacterClass('\\', '$'), CharacterClass.Range('0', '9')),
                    new Sequence(new CharacterClass('\\'), CharacterClass.Range('0', '7'), CharacterClass.Range('0', '7'), CharacterClass.Range('0', '7'))
                    )
            };

            var allowedMetaCharacters = new Pattern("allowedMetaCharacter")
            {
                Data = new CaptureGroup((int)CaptureType.MetaCharacter,
                                        new PrioritizedChoice(
                                            new Sequence(new CharacterClass('\\'), new CharacterClass('t', 'n', 'r', 'f', 'b', 'B', 'd', 'D', 's', 'S', 'w', 'W', 'Q', 'U', 'L')),
                                            CharacterClass.String(@"*?"),
                                            CharacterClass.String(@"+?"),
                                            CharacterClass.String(@"$`"),
                                            CharacterClass.String(@"$'"),
                                            CharacterClass.String(@"$&"),
                                            CharacterClass.String(@"\cX"),
                                            new Sequence(new CharacterClass('\\', '$'), CharacterClass.Range('0', '9')),
                                            new Sequence(new CharacterClass('\\'), CharacterClass.Range('0', '7'), CharacterClass.Range('0', '7'), CharacterClass.Range('0', '7'))
                                            )
                                        )
            };

            var character = new Pattern("character")
            {
                Data = new CaptureGroup((int)CaptureType.Char,
                                        new PrioritizedChoice(
                                            new Sequence(
                                                new CharacterClass('\\'),
                                                metaCharacter
                                                ),
                                            new Sequence(
                                                new Not(metaCharacter),
                                                new Any()
                                                )
                                            )
                                        )
            };

            var range    = new CaptureGroup((int)CaptureType.Range, new Sequence(character, new CharacterClass('-'), character));
            var setItem  = new PrioritizedChoice(range, character);
            var setItems = new Pattern()
            {
                Data = Operator.OneOrMore(setItem)
            };
            var positiveSet = new CaptureGroup((int)CaptureType.PositiveSet, new Sequence(new CharacterClass('['), setItems, new CharacterClass(']')));
            var negativeSet = new CaptureGroup((int)CaptureType.NegativeSet, new Sequence(CharacterClass.String("[^"), setItems, new CharacterClass(']')));
            var set         = new Pattern("set")
            {
                Data = new PrioritizedChoice(negativeSet, positiveSet)
            };
            var eos   = new CaptureGroup((int)CaptureType.Eos, new CharacterClass('$'));
            var any   = new CaptureGroup((int)CaptureType.Any, new CharacterClass('.'));
            var group = new Sequence(new CharacterClass('('), RE, new CharacterClass(')'));

            var elementaryRE = new Pattern("elementaryRE")
            {
                Data = new PrioritizedChoice(group, any, eos, set, character, allowedMetaCharacters)
            };

            var number      = Operator.OneOrMore(CharacterClass.Range('0', '9'));
            var repeatRange = new Sequence(new CharacterClass('{'), new CaptureGroup((int)CaptureType.RepeatRange, new Sequence(number, Operator.Optional(new Sequence(new CharacterClass(','), number)))), new CharacterClass('}'));

            var plus = new Pattern("plus")
            {
                Data = new CaptureGroup((int)CaptureType.Plus, new Sequence(elementaryRE, new CharacterClass('+')))
            };
            var star = new Pattern("star")
            {
                Data = new CaptureGroup((int)CaptureType.Star, new Sequence(elementaryRE, new CharacterClass('*')))
            };
            var repeat = new Pattern("repeat")
            {
                Data = new CaptureGroup((int)CaptureType.Repeat, new Sequence(elementaryRE, repeatRange))
            };
            var basicRE = new PrioritizedChoice(star, plus, repeat, elementaryRE);

            simpleRE.Data = new CaptureGroup((int)CaptureType.Concatenation, Operator.OneOrMore(basicRE));

            RE.Data = new CaptureGroup((int)CaptureType.Union, new Sequence(simpleRE, new ZeroOrMore(new Sequence(new CharacterClass('|'), RE))));

            Parser = patternCompiler.Compile(RE);
        }
Esempio n. 4
0
 public static IRunner CompileGrammar(this PatternCompiler patternCompiler, string grammarStr)
 {
     return(patternCompiler.Compile(grammar.ParseGrammar(grammarStr).Last()));
 }