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 override void VisitLeave(OneOrMore expression) { IsMatchPredicate local = _matchStack.Pop(); _matchStack.Push( delegate(IInputIterator iterator) { Int32 cnt = 0; Int32 savePosition = iterator.Index; while (local(iterator)) { cnt++; if (savePosition == iterator.Index) { //InfiniteLoopDetectedException break; } savePosition = iterator.Index; } iterator.Index = savePosition; return (cnt > 0); } ); }
public override void VisitExecute(OneOrMore expression) { }
public override void VisitEnter(OneOrMore expression) { }
public override void VisitLeave(OneOrMore expression) { terminal.Peek().Append(")+"); }
public override void VisitEnter(OneOrMore expression) { terminal.Peek().Append("("); }
public abstract void VisitEnter(OneOrMore expression);
public abstract void VisitLeave(OneOrMore expression);
public abstract void VisitExecute(OneOrMore expression);