示例#1
0
        /// <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);
        }
示例#2
0
        /// <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));
        }