/// <summary> /// Inner parse method /// </summary> /// <param name="scanner">scanner</param> /// <returns>the match</returns> protected override ParserMatch ParseMain(IScanner scanner) { // save scanner state long offset = scanner.Offset; // apply the first parser ParserMatch m = FirstParser.Parse(scanner); // if m1 successful, do m2 if (m.Success) { return(m); } // not found try the next scanner.Seek(offset); // apply the second parser m = SecondParser.Parse(scanner); if (m.Success) { return(m); } scanner.Seek(offset); return(ParserMatch.CreateFailureMatch(scanner)); }
/// <summary> /// Inner parse method /// </summary> /// <param name="scanner">scanner</param> /// <returns>the match</returns> protected override ParserMatch ParseMain(IScanner scanner) { // save scanner state long offset = scanner.Offset; // apply the first parser ParserMatch m = FirstParser.Parse(scanner); // if m1 successful, do m2 if (m.Success) { ParserMatch m2 = SecondParser.Parse(scanner); if (m2.Success) { m.Concat(m2); } else { m = ParserMatch.CreateFailureMatch(scanner, offset); } } // restoring parser failed, rewind scanner if (!m.Success) { scanner.Seek(offset); } return(m); }
/// <summary> /// Inner parse method /// </summary> /// <param name="scanner">scanner</param> /// <returns>the match</returns> protected override ParserMatch ParseMain(IScanner scanner) { long offset = scanner.Offset; ParserMatch m = FirstParser.Parse(scanner); if (!m.Success) { scanner.Seek(offset); return(m); } while (!scanner.AtEnd) { offset = scanner.Offset; ParserMatch b = SecondParser.Parse(scanner); if (!b.Success) { scanner.Seek(offset); return(m); } ParserMatch a = FirstParser.Parse(scanner); if (!a.Success) { scanner.Seek(offset); return(m); } m.Concat(b); m.Concat(a); } return(m); }
/// <summary> /// Inner parse method /// </summary> /// <param name="scanner">scanner</param> /// <returns>the match</returns> protected override ParserMatch ParseMain(IScanner scanner) { long offset = scanner.Offset; ParserMatch m = FirstParser.Parse(scanner); if (m.Success) { StringScanner firstMatch = new StringScanner(m.Value); ParserMatch m2 = SecondParser.Parse(firstMatch); if (m2.Success) { return(m); } } scanner.Seek(offset); return(ParserMatch.CreateFailureMatch(scanner)); }
/// <summary> /// Inner parse method /// match (first but not second) or (second but not first) /// </summary> /// <param name="scanner">scanner</param> /// <returns>the match</returns> protected override ParserMatch ParseMain(Scanners.IScanner scanner) { long startOffset = scanner.Offset; ParserMatch m1 = FirstParser.Parse(scanner); long offset1 = scanner.Offset; scanner.Seek(startOffset); ParserMatch m2 = SecondParser.Parse(scanner); if (m1.Success && !m2.Success) { scanner.Seek(offset1); return(m1); } if (m2.Success && !m1.Success) { return(m2); } scanner.Seek(startOffset); return(ParserMatch.CreateFailureMatch(scanner)); }