示例#1
0
 public override void InitGrammar(Grammar grammar, string ruleName)
 {
     Grammar  = grammar;
     RuleName = ruleName;
     FirstParser.InitGrammar(grammar, ruleName);
     SecondParser.InitGrammar(grammar, ruleName);
 }
示例#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 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);
        }
示例#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 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));
        }
示例#4
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);
        }
示例#5
0
        private void BtnMargeClick(object sender, EventArgs e)
        {
            listPreview.Items.Clear();

            var listMergedQuote = QuoteParseManager.Merge(listResultContent.Items.Cast <string>().ToList());

            if (rbtnFirstParserSaveFormat.Checked)
            {
                ListStringMergedQuotes = SecondParser.QuoteListToString(listMergedQuote).ToArray();
            }
            if (rbtnSecondParserSaveFormat.Checked)
            {
                ListStringMergedQuotes = FirstParser.QuoteListToString(listMergedQuote).ToArray();
            }

            listPreview.Items.AddRange(ListStringMergedQuotes);
        }
        /// <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));
        }
示例#7
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);
        }
示例#8
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));
        }