예제 #1
0
        /// <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);
        }
예제 #2
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);
        }
예제 #3
0
        public override ParserMatch ParseMain(IScanner scanner)
        {
            if (scanner == null)
            {
                throw new ArgumentNullException(nameof(scanner));
            }

            long offset = scanner.Offset;

            ParserMatch a = null, b = null;

            ParserMatch m = this.FirstParser.Parse(scanner);

            if (!m.Success)
            {
                scanner.Seek(offset);

                return(scanner.NoMatch);
            }

            while (!scanner.AtEnd)
            {
                offset = scanner.Offset;

                b = this.SecondParser.Parse(scanner);

                if (!b.Success)
                {
                    scanner.Seek(offset);

                    return(m);
                }

                a = this.FirstParser.Parse(scanner);

                if (!a.Success)
                {
                    scanner.Seek(offset);

                    return(m);
                }

                m.Concat(b);

                m.Concat(a);
            }

            return(m);
        }
예제 #4
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 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);
        }
예제 #5
0
        public override ParserMatch ParseMain(IScanner scanner)
        {
            if (scanner == null)
            {
                throw new ArgumentNullException(nameof(scanner));
            }

            // save scanner state
            long offset = scanner.Offset;

            // apply the first parser
            ParserMatch m = this.FirstParser.Parse(scanner);

            // if m1 successful, do m2
            if (m.Success)
            {
                ParserMatch m2 = this.SecondParser.Parse(scanner);

                if (m2.Success)
                {
                    m.Concat(m2);
                }
                else
                {
                    m = scanner.NoMatch;
                }
            }

            // restoring parser failed, rewind scanner
            if (!m.Success)
            {
                scanner.Seek(offset);
            }
            return(m);
        }
예제 #6
0
        public void Concat()
        {
            IScanner scanner = Provider.NewScanner;

            scanner.Read();

            long startOffset1 = scanner.Offset;

            scanner.Read();
            long endOffset1 = scanner.Offset;

            ParserMatch match1 = ParserMatch.CreateSuccessfulMatch(scanner, startOffset1, endOffset1);

            long startOffset2 = scanner.Offset;

            scanner.Read();
            scanner.Read();
            long endOffset2 = scanner.Offset;

            ParserMatch match2 = ParserMatch.CreateSuccessfulMatch(scanner, startOffset2, endOffset2);

            match1.Concat(match2);

            Assert.AreEqual(startOffset1, match1.Offset);
            Assert.AreEqual(endOffset2 - startOffset1, match1.Length);
            Assert.IsFalse(match1.Empty);
        }
예제 #7
0
        public override ParserMatch ParseMain(IScanner scanner)
        {
            if (scanner == null)
            {
                throw new ArgumentNullException(nameof(scanner));
            }

            long offset = scanner.Offset;

            ParserMatch m = this.FirstParser.Parse(scanner);

            if (m.Success)
            {
                ParserMatch m2 = this.SecondParser.Parse(scanner);

                if (m2.Success)
                {
                    m.Concat(m2);

                    return(m);
                }
            }
            else
            {
                scanner.Seek(offset);

                m = this.SecondParser.Parse(scanner);

                if (m.Success)
                {
                    ParserMatch m2 = this.FirstParser.Parse(scanner);

                    if (m2.Success)
                    {
                        m.Concat(m2);

                        return(m);
                    }
                }
            }

            scanner.Seek(offset);

            return(scanner.NoMatch);
        }
예제 #8
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);
        }