コード例 #1
0
        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);
        }
コード例 #2
0
ファイル: Grammar.cs プロジェクト: macias/NaiveLanguageTools
        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));
        }