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); }
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); }
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"); }
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); }
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"); }