/// <summary> /// Inner parse method /// </summary> /// <param name="scanner">scanner</param> /// <returns>the match</returns> protected override ParserMatch ParseMain(IScanner scanner) { if (scanner.AtEnd) { return(ParserMatch.CreateSuccessfulEmptyMatch(scanner)); } return(ParserMatch.CreateFailureMatch(scanner)); }
public void EmptyMatch() { IScanner scanner = Provider.NewScanner; ParserMatch m = ParserMatch.CreateSuccessfulEmptyMatch(scanner); Assert.IsTrue(m.Success); Assert.IsTrue(m.Empty); }
/// <summary> /// Inner parse method /// </summary> /// <param name="scanner">scanner</param> /// <returns>the match</returns> protected override ParserMatch ParseMain(IScanner scanner) { // save scanner state long startOffset = scanner.Offset; ParserMatch m = ParserMatch.CreateSuccessfulEmptyMatch(scanner); ParserMatch m_temp; // execution bound int count = 0; // lower bound, minimum number of executions while (count < LowerBound && !scanner.AtEnd) { m_temp = Parser.Parse(scanner); // stop if not successful if (!m_temp.Success) { break; } // increment count and update full match ++count; m.Concat(m_temp); } if (count == LowerBound) { while (count < UpperBound && !scanner.AtEnd) { m_temp = Parser.Parse(scanner); // stop if not successful if (!m_temp.Success) { break; } // increment count ++count; m.Concat(m_temp); } } else { m = ParserMatch.CreateFailureMatch(scanner, startOffset); } // restoring parser failed, rewind scanner if (!m.Success) { scanner.Seek(startOffset); } return(m); }
public void Concat_MatchOntoEmpty_Match() { IScanner scanner = Provider.NewScanner; scanner.Read(); ParserMatch emptyMatch = ParserMatch.CreateSuccessfulEmptyMatch(scanner); long startOffset = scanner.Offset; scanner.Read(); long endOffset = scanner.Offset; ParserMatch match = ParserMatch.CreateSuccessfulMatch(scanner, startOffset, endOffset); emptyMatch.Concat(match); Assert.AreEqual(startOffset, emptyMatch.Offset); Assert.AreEqual(endOffset - startOffset, emptyMatch.Length); Assert.IsFalse(emptyMatch.Empty); }