/// <summary> /// Inner parse method /// </summary> /// <param name="scanner">scanner</param> /// <returns>the match</returns> protected override ParserMatch ParseMain(Scanners.IScanner scanner) { ParserMatch m = FirstParser.TryAccept(scanner); if (!m.Success) { return(m); } // doing difference ParserMatch d = SecondParser.TryAccept(scanner); if (d.Success) { if (d.Length >= m.Length) { return(ParserMatch.CreateFailureMatch(scanner, m.Offset, 0)); } } // ok FirstParser.Parse(scanner); return(m); }
/// <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)); }