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));
}
}