示例#1
0
        public void NonTerminal_Predicate_And()
        {
            // predicates should not adjust the
            // iterator once the expression is evaluated.
            AExpression Digit = new CharacterClass {ClassExpression = "[0-9]"};

            // regex expression: \d+
            var input = Encoding.UTF8.GetBytes("01234567890123456789");
            var iterator = new ByteInputIterator(input);
            AExpression andPredicate = new OneOrMore(Digit).And();
            var visitor = new NpegParserVisitor(iterator);
            andPredicate.Accept(visitor);
            Assert.IsTrue(visitor.IsMatch);
            Assert.IsTrue(iterator.Index == 0);
        }
示例#2
0
        public void NonTerminal_Predicate_Or()
        {
            // predicates should not adjust the
            // iterator once the expression is evaluated.
            AExpression Digit = new CharacterClass {ClassExpression = "[0-9]"};

            // equivalent to: regex '^' '$'
            // regex expression: ^\d+$
            var bytes = Encoding.UTF8.GetBytes("0123456abcdefg");
            var iterator = new ByteInputIterator(bytes);
            AExpression notPredicate = new OneOrMore(Digit).And().Sequence(new NotPredicate(new AnyCharacter()));
            var visitor = new NpegParserVisitor(iterator);
            notPredicate.Accept(visitor);
            Assert.IsFalse(visitor.IsMatch); // should fail
            Assert.IsTrue(iterator.Index == 0);
        }
示例#3
0
        public void Terminal_CharacterClass()
        {
            AExpression Digit = new CharacterClass {ClassExpression = "[0-9]"};

            var input = "0";
            var bytes = Encoding.UTF8.GetBytes(input);
            var iterator = new ByteInputIterator(bytes);
            var visitor = new NpegParserVisitor(iterator);
            Digit.Accept(visitor);
            Assert.IsTrue(visitor.IsMatch);

            input = "0123456789";
            bytes = Encoding.UTF8.GetBytes(input);
            iterator = new ByteInputIterator(bytes);
            visitor = new NpegParserVisitor(iterator);
            new OneOrMore(Digit).Accept(visitor);
            Assert.IsTrue(visitor.IsMatch);
        }
        public void CompositeVisitor_Recursiveness()
        {
            var whitespace = new CharacterClass {ClassExpression = "[ \t\r\n\v]"};

            var terminal = new PrioritizedChoice(
                new CapturingGroup("AnyCharacter", new Literal {MatchText = "."})
                ,
                new CapturingGroup("CapturingGroup",
                                   new Sequence(
                                   	new Literal {MatchText = "(?<"},
                                   	new CapturingGroup("ReplacementNode",
                                   	                   new OneOrMore(
                                   	                   	new CharacterClass {ClassExpression = "[a-z0-9A-Z]"}
                                   	                   	)
                                   		)
                                   	)
                                   	.Sequence(new Literal {MatchText = ">"})
                                   	.Sequence(new RecursionCall("Expression"))
                                   	.Sequence(new Literal {MatchText = ")"})
                    )
                );

            var sequence = new CapturingGroup(
                "Sequence",
                new Sequence(
                    terminal,
                    new ZeroOrMore(whitespace)
                    ).Plus()
                ) {DoReplaceBySingleChildNode = true};

            var prioritizedchoice = new CapturingGroup("PrioritizedChoice",
                                                       new Sequence(
                                                       	sequence,
                                                       	new Literal {MatchText = "/"}
                                                       	)
                                                       	.Sequence(new ZeroOrMore(whitespace))
                                                       	.Sequence(sequence)
                                                       	.Sequence(
                                                       		new ZeroOrMore(
                                                       			new Sequence(
                                                       				new ZeroOrMore(whitespace),
                                                       				new Literal {MatchText = "/"}
                                                       				)
                                                       				.Sequence(new ZeroOrMore(whitespace))
                                                       				.Sequence(sequence)
                                                       				.Plus()
                                                       			)
                                                       	)
                );

            var expression = new CapturingGroup("Root",
                                                new RecursionCreate("Expression",
                                                                    new PrioritizedChoice(prioritizedchoice, sequence)));

            var input = @"(?<NPEGNode>./.. )";
            var bytes = Encoding.UTF8.GetBytes(input);
            var iterator = new ByteInputIterator(bytes);
            var visitor = new NpegParserVisitor(iterator);
            expression.Accept(visitor);

            Assert.IsTrue(visitor.IsMatch);
            AstNode node = visitor.AST;
            Assert.IsTrue(node.Token.Name == "Root");
            Assert.IsTrue(node.Children.Count == 1);
            Assert.IsTrue(node.Children.Count == 1);
            Assert.IsTrue(node.Children[0].Token.Name == "CapturingGroup");
            Assert.IsTrue(node.Children[0].Children.Count == 2);
            Assert.IsTrue(node.Children[0].Children[0].Token.Name == "ReplacementNode");
            Assert.IsTrue(node.Children[0].Children[1].Token.Name == "PrioritizedChoice");
            Assert.IsTrue(node.Children[0].Children[1].Children[0].Token.Name == "AnyCharacter");
            Assert.IsTrue(node.Children[0].Children[1].Children[1].Token.Name == "Sequence");
            Assert.IsTrue(node.Children[0].Children[1].Children[1].Children[0].Token.Name == "AnyCharacter");
            Assert.IsTrue(node.Children[0].Children[1].Children[1].Children[1].Token.Name == "AnyCharacter");
        }
        public void CompositeVisitor_CapturingGroup_SandBoxTest_PriorityChoice2()
        {
            var mSpace = new CharacterClass {ClassExpression = "[ \t]"};
            var limiting = new CapturingGroup("LimitingRepetition",
                                              new Sequence(
                                              	new Sequence(
                                              		new Literal {MatchText = "{"},
                                              		new ZeroOrMore(mSpace)
                                              		),
                                              	new PrioritizedChoice(
                                              		new CapturingGroup("BETWEEN",
                                              		                   new Sequence(
                                              		                   	new CapturingGroup("Min",
                                              		                   	                   new OneOrMore(new CharacterClass
                                              		                   	                                 	{ClassExpression = "[0-9]"}))
                                              		                   		.Sequence(new ZeroOrMore(mSpace)),
                                              		                   	new Literal {MatchText = ","}
                                              		                   	)
                                              		                   	.Sequence(
                                              		                   		new Sequence(new ZeroOrMore(mSpace),
                                              		                   		             new CapturingGroup("Max",
                                              		                   		                                new OneOrMore(
                                              		                   		                                	new CharacterClass
                                              		                   		                                		{
                                              		                   		                                			ClassExpression = "[0-9]"
                                              		                   		                                		})))
                                              		                   	)
                                              			)
                                              		,
                                              		new CapturingGroup("ATMOST",
                                              		                   new Sequence(
                                              		                   	new Literal {MatchText = ","}
                                              		                   	,
                                              		                   	new Sequence(new ZeroOrMore(mSpace),
                                              		                   	             new CapturingGroup("Max",
                                              		                   	                                new OneOrMore(
                                              		                   	                                	new CharacterClass
                                              		                   	                                		{ClassExpression = "[0-9]"})))
                                              		                   	)
                                              			)
                                              		)
                                              		.Or
                                              		(
                                              			new CapturingGroup("ATLEAST",
                                              			                   new Sequence(
                                              			                   	new Sequence(new ZeroOrMore(mSpace),
                                              			                   	             new CapturingGroup("Min",
                                              			                   	                                new OneOrMore(
                                              			                   	                                	new CharacterClass
                                              			                   	                                		{
                                              			                   	                                			ClassExpression = "[0-9]"
                                              			                   	                                		}))).Sequence(
                                              			                   	                                			new ZeroOrMore(mSpace))
                                              			                   	,
                                              			                   	new Literal {MatchText = ","}
                                              			                   	)
                                              				)
                                              		)
                                              		.Or
                                              		(
                                              			new CapturingGroup("EXACT",
                                              			                   new OneOrMore(new CharacterClass {ClassExpression = "[0-9]"}))
                                              		)
                                              	)
                                              	.Sequence(
                                              		new ZeroOrMore(mSpace)
                                              	)
                                              	.Sequence(
                                              		new Literal {MatchText = "}"}
                                              	)
                );

            var any = new CapturingGroup("AnyCharacter", new Literal {MatchText = "."});

            var expression = new CapturingGroup("Expression",
                                                new PrioritizedChoice(
                                                    new Sequence(any, limiting),
                                                    new Sequence(limiting, any)
                                                    )
                );

            var input = ".{77,55}";
            var bytes = Encoding.UTF8.GetBytes(input);
            var visitor = new NpegParserVisitor(
                new ByteInputIterator(bytes)
            );
            expression.Accept(visitor);

            Assert.IsTrue(visitor.IsMatch);
            AstNode node = visitor.AST;
            Assert.IsTrue(node.Token.Name == "Expression");
            Assert.IsTrue(node.Children.Count == 2);
            Assert.IsTrue(node.Children[0].Token.Name == "AnyCharacter");
            Assert.IsTrue(node.Children[1].Token.Name == "LimitingRepetition");
        }
示例#6
0
        public void Terminal_LimitingRepetition()
        {
            // min
            // min max
            // max
            // math expression using back referencing {(\k<C2> - \k<C1>)+1} - variable length protocols

            AExpression Digits = new CharacterClass {ClassExpression = "[0-9]"};

            #region nonterminals

            var MinTrue0 = new CapturingGroup("MinTrue",
                                              new LimitingRepetition(Digits) {Min = 0}
                );
            var MinFalse = new CapturingGroup("MinFalse",
                                              new LimitingRepetition(Digits) {Min = 44}
                );

            var MinTrue5 = new CapturingGroup("MinTrue",
                                              new LimitingRepetition(Digits) {Min = 5}
                );
            var MaxTrue = new CapturingGroup("MaxTrue",
                                             new LimitingRepetition(Digits) {Max = 5}
                );
            var MinMax = new CapturingGroup("MinMax",
                                            new LimitingRepetition(Digits) {Min = 5, Max = 6}
                );

            var ExceptionNoMinMax = new CapturingGroup("ExceptionNoMinMax",
                                                       new LimitingRepetition(Digits) {}
                );
            var ExceptionMaxLessThanMin = new CapturingGroup("ExceptionMaxLessThanMin",
                                                             new LimitingRepetition(Digits) {Min = 5, Max = 0}
                );

            #endregion

            String input = "1234567890";
            var bytes = Encoding.UTF8.GetBytes(input);
            var iterator = new ByteInputIterator(bytes);
            var visitor = new NpegParserVisitor(iterator);

            MinTrue0.Accept(visitor);
            Assert.IsTrue(visitor.IsMatch);
            AstNode node = visitor.AST;

            iterator.Index = 0;
            visitor = new NpegParserVisitor(iterator);
            MinFalse.Accept(visitor);
            Assert.IsFalse(visitor.IsMatch);

            iterator.Index = 0;
            visitor = new NpegParserVisitor(iterator);
            MinTrue5.Accept(visitor);
            Assert.IsTrue(visitor.IsMatch);
            node = visitor.AST;
            Assert.IsTrue(node.Token.ValueAsString(iterator) == input);

            iterator.Index = 0;
            visitor = new NpegParserVisitor(iterator);
            MaxTrue.Accept(visitor);
            Assert.IsTrue(visitor.IsMatch);
            node = visitor.AST;

            iterator.Index = 0;
            visitor = new NpegParserVisitor(iterator);
            MinMax.Accept(visitor);
            Assert.IsTrue(visitor.IsMatch);
            node = visitor.AST;

            Int32 exceptionCount = 0;
            try
            {
                iterator.Index = 0;
                visitor = new NpegParserVisitor(iterator);
                ExceptionNoMinMax.Accept(visitor);
                Assert.IsTrue(visitor.IsMatch);
                node = visitor.AST;
            }
            catch (ArgumentException)
            {
                exceptionCount++;
            }

            try
            {
                iterator.Index = 0;
                visitor = new NpegParserVisitor(iterator);
                ExceptionMaxLessThanMin.Accept(visitor);
                Assert.IsTrue(visitor.IsMatch);
                node = visitor.AST;
            }
            catch (ArgumentException)
            {
                exceptionCount++;
            }

            Assert.IsTrue(exceptionCount == 2);
        }
示例#7
0
 public abstract void Visit(CharacterClass expression);
        public void PracticalExample_PhoneNumber()
        {
            #region terminals

            AExpression Digits = new CharacterClass {ClassExpression = "[0-9]"};
            AExpression Hyphen = new Literal {MatchText = "-"};

            #endregion

            #region nonterminals

            AExpression ThreeDigitCode = new CapturingGroup("ThreeDigitCode", new Sequence(Digits, Digits).Sequence(Digits));

            AExpression FourDigitCode = new CapturingGroup("FourDigitCode",
                                                           new Sequence(Digits, Digits).Sequence(Digits).Sequence(Digits));

            AExpression PhoneNumber = new CapturingGroup("PhoneNumber",
                                                         new Sequence(ThreeDigitCode, Hyphen)
                                                         	.Sequence(ThreeDigitCode)
                                                         	.Sequence(Hyphen)
                                                         	.Sequence(FourDigitCode)
                );

            #endregion

            String input = "123-456-7890";

            // Test Manual Composite

            var bytes = Encoding.UTF8.GetBytes(input);
            var iterator = new ByteInputIterator(bytes);
            var visitor = new NpegParserVisitor(iterator);
            PhoneNumber.Accept(visitor);

            Assert.IsTrue(visitor.IsMatch);
            AstNode node = visitor.AST;
            Assert.IsTrue(node.Token.Name == "PhoneNumber");
            Assert.IsTrue(node.Token.ValueAsString(iterator) == "123-456-7890");
            Assert.IsTrue(node.Children[0].Token.Name == "ThreeDigitCode");
            Assert.IsTrue(node.Children[0].Token.ValueAsString(iterator) == "123");
            Assert.IsTrue(node.Children[1].Token.Name == "ThreeDigitCode");
            Assert.IsTrue(node.Children[1].Token.ValueAsString(iterator) == "456");
            Assert.IsTrue(node.Children[2].Token.Name == "FourDigitCode");
            Assert.IsTrue(node.Children[2].Token.ValueAsString(iterator) == "7890");
        }