internal static LexPattern Merge(TypeEnum type, StringCaseComparison stringComparison, IEnumerable <LexPattern> patterns) { var result = new LexPattern(type) { pattern = PatternBuilder.Merge(patterns.Select(it => it.pattern)) }; result.SetStringComparison(stringComparison); return(result); }
private LexPattern mergeLexPatterns(IEnumerable <ILexPattern> rawPatterns) { if (!rawPatterns.Any()) { throw new ArgumentException("Internal error"); } if (rawPatterns.WhereType <LexPattern>().Any(it => it.Type == LexPattern.TypeEnum.EofAction)) { if (rawPatterns.Count() != 1) { throw new ArgumentException("Internal error"); } else { return(rawPatterns.WhereType <LexPattern>().Single()); } } IEnumerable <string> unknowns = rawPatterns .WhereType <LexPatternName>() .Select(it => it.Name) .Where(it => !lexerPatternNames.ContainsKey(it)) .ToArray(); if (unknowns.Any()) { ParseControlException.ThrowAndRun(new[] { "Unknown pattern name(s): " + unknowns.Join(", ") + "." }); } IEnumerable <LexPattern> patterns = rawPatterns.Select(it => { var name = it as LexPatternName; if (name == null) { return(it as LexPattern); } else { return(lexerPatternNames[name.Name]); } }).ToArray(); LexPattern head = patterns.First(); if (patterns.Any(it => head.Type != it.Type || head.StringComparison != it.StringComparison)) { ParseControlException.ThrowAndRun(new[] { "Cannot mix pattern modes." }); } return(LexPattern.Merge(head.Type, head.StringComparison, patterns)); }