Exemplo n.º 1
0
 /// <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));
 }
Exemplo n.º 2
0
        public void EmptyMatch()
        {
            IScanner    scanner = Provider.NewScanner;
            ParserMatch m       = ParserMatch.CreateSuccessfulEmptyMatch(scanner);

            Assert.IsTrue(m.Success);
            Assert.IsTrue(m.Empty);
        }
Exemplo n.º 3
0
        /// <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);
        }
Exemplo n.º 4
0
        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);
        }