Ejemplo n.º 1
0
        private Parser<char, string> createParser(BasePattern pattern)
        {
            if (pattern == null)
                throw new ArgumentNullException("pattern.", "Pattern is null when creating match parser.");

            switch (pattern.Type)
            {
                case PatternType.Group:
                    return from vs in
                               CharParsers.Sequence(((GroupPattern)pattern).Patterns
                                                                           .Select(p => createParser(p)))
                           select vs.JoinStrings();

                case PatternType.Quantifier:
                    QuantifierPattern quant = (QuantifierPattern)pattern;
                    return from vs in CharParsers.Count(quant.MinOccurrences,
                                                        quant.MaxOccurrences,
                                                        createParser(quant.ChildPattern))
                           select vs.JoinStrings();

                case PatternType.Alternation:
                    return CharParsers.Choice(((AlternationPattern)pattern).Alternatives
                                                                           .Select(p => createParser(p))
                                                                           .ToArray());

                case PatternType.String:
                    return CharParsers.String(((StringPattern)pattern).Value);

                case PatternType.Char:
                    return from c in CharParsers.Satisfy(((CharPattern)pattern).IsMatch)
                           select new string(c, 1);

                default:
                    throw new ApplicationException(
                        string.Format("ExplicitDFAMatcher: unrecognized pattern type ({0}).",
                                      pattern.GetType().Name));
            }
        }