示例#1
0
        private void AddRules(FragmentMatchData matchData)
        {
            foreach (FragmentMatchData fragmentData in matchData.Parts.Cast <FragmentMatchData>())
            {
                string          name     = ((FragmentMatchData)fragmentData.Parts[0]).Parts[0].ToString();
                FragmentMatcher fragment = new FragmentMatcher(_fragmentMatcherMap.Count + 1, name);
                _fragmentMatcherMap[name] = (fragment, fragmentData);
                _languageMatcher.Fragments.Add(fragment);
            }

            foreach (KeyValuePair <string, (FragmentMatcher, FragmentMatchData)> fragmentPair in _fragmentMatcherMap.ToArray())
            {
                AddRule(fragmentPair);
            }
        }
示例#2
0
        public static LanguageMatcher GetJsonMatcher()
        {
            lock (_matcherMap)
            {
                if (!_matcherMap.TryGetValue(Language.Json.ToString(), out LanguageMatcher languageMatcher))
                {
                    PatternMatcher stringLiteralPattern  = PatternReader.LazyParse(id: 1, name: "String", pattern: "\"((\"!.)|\\\\.)+\"");
                    PatternMatcher nullPattern           = PatternReader.LazyParse(id: 2, name: "Null", pattern: "`~null");
                    PatternMatcher booleanPattern        = PatternReader.LazyParse(id: 3, name: "Boolean", pattern: "`~true|false");
                    PatternMatcher numberPattern         = PatternReader.LazyParse(id: 4, name: "Number", pattern: "~-?(\\d*\\.\\d+(e(-|\\+)?\\d+)?|\\d+)");
                    PatternMatcher colonSeparatorPattern = PatternReader.LazyParse(id: 5, name: "ColonSeparator", pattern: "\\s*:\\s*");
                    PatternMatcher commaSeparatorPattern = PatternReader.LazyParse(id: 6, name: "CommaSeparator", pattern: "\\s*,\\s*");
                    PatternMatcher openBracePattern      = PatternReader.LazyParse(id: 7, name: "OpenBrace", pattern: "\\{");
                    PatternMatcher closeBracePattern     = PatternReader.LazyParse(id: 8, name: "CloseBrace", pattern: "\\}");
                    PatternMatcher openBracketPattern    = PatternReader.LazyParse(id: 9, name: "OpenBracket", pattern: "\\[");
                    PatternMatcher closeBracketPattern   = PatternReader.LazyParse(id: 10, name: "CloseBracket", pattern: "\\]");
                    PatternMatcher whitespacePattern     = PatternReader.LazyParse(id: 11, name: "Whitespace", pattern: "\\s+");

                    FragmentMatcher keyValueFragment = new FragmentMatcher(id: 5, name: "KeyValue", parts: new IMatcher[2] {
                        stringLiteralPattern, null
                    }, partsMatchMode: MatchMode.Ordered, partsDelimiter: colonSeparatorPattern);
                    FragmentMatcher objectFragment = new FragmentMatcher(id: 4, name: "Object", parts: new IMatcher[] { keyValueFragment }, partsMatchMode: MatchMode.Multiple, partsDelimiter: commaSeparatorPattern, minMatchedParts: 3, partsPadding: whitespacePattern, start: openBracePattern, end: closeBracePattern);
                    FragmentMatcher arrayFragment  = new FragmentMatcher(id: 3, name: "Array", parts: new IMatcher[1], partsMatchMode: MatchMode.Multiple, partsDelimiter: commaSeparatorPattern, minMatchedParts: 0, partsPadding: whitespacePattern, start: openBracketPattern, end: closeBracketPattern);
                    FragmentMatcher itemFragment   = new FragmentMatcher(id: 2, name: "Item", parts: new IMatcher[] { objectFragment, arrayFragment, booleanPattern, nullPattern, stringLiteralPattern, numberPattern }, partsMatchMode: MatchMode.One, fallThrough: true);
                    arrayFragment.Parts[0]    = itemFragment;
                    keyValueFragment.Parts[1] = itemFragment;
                    FragmentMatcher jsonFragment = new FragmentMatcher(id: 1, name: "Json", parts: new IMatcher[] { objectFragment, arrayFragment }, partsMatchMode: MatchMode.One, partsPadding: whitespacePattern);

                    languageMatcher = new LanguageMatcher
                    {
                        Name             = Language.Json.ToString(),
                        IndexingMode     = IndexingMode.Lazy,
                        StartingFragment = jsonFragment,
                        Fragments        = new List <FragmentMatcher> {
                            keyValueFragment, objectFragment, arrayFragment, itemFragment, jsonFragment
                        },
                        Patterns = new List <PatternMatcher> {
                            stringLiteralPattern, nullPattern, booleanPattern, numberPattern, colonSeparatorPattern, commaSeparatorPattern, openBracePattern, closeBracePattern, openBracketPattern, closeBracketPattern, whitespacePattern
                        }
                    };
                    _matcherMap[Language.Json.ToString()] = languageMatcher;
                }
                return(languageMatcher);
            }
        }
示例#3
0
        public static LanguageMatcher Convert(LanguageMatcherDefinition languageMatcherModel)
        {
            Dictionary <string, PatternMatcher> patternMatcherMap = new Dictionary <string, PatternMatcher>(StringComparer.Ordinal);
            List <PatternMatcher> patternMatchers = new List <PatternMatcher>(languageMatcherModel.Patterns.Count);
            Dictionary <string, FragmentMatcher> fragmentMatcherMap = new Dictionary <string, FragmentMatcher>(StringComparer.Ordinal);
            List <FragmentMatcher> fragmentMatchers = new List <FragmentMatcher>(languageMatcherModel.Fragments.Count);

            bool isEagar = languageMatcherModel.IndexingMode == IndexingMode.Eager;

            for (int patternIndex = 0; patternIndex < languageMatcherModel.Patterns.Count; patternIndex++)
            {
                PatternMatcherDefinition model          = languageMatcherModel.Patterns[patternIndex];
                PatternMatcher           patternMatcher = isEagar ? PatternReader.Parse(patternIndex + 1, model.Name, model.Pattern) : PatternReader.LazyParse(patternIndex + 1, model.Name, model.Pattern);
                patternMatcher.IsNoise  = model.IsNoise;
                patternMatcher.Mergable = model.Mergable;
                patternMatcherMap.Add(patternMatcher.Name, patternMatcher);
                patternMatchers.Add(patternMatcher);
            }

            for (int matcherIndex = 0; matcherIndex < languageMatcherModel.Fragments.Count; matcherIndex++)
            {
                FragmentMatcherDefinition model           = languageMatcherModel.Fragments[matcherIndex];
                FragmentMatcher           fragmentMatcher = new FragmentMatcher
                                                            (
                    id: matcherIndex + 1,
                    name: model.Name,
                    parts: new List <IMatcher>(),
                    fallThrough: model.FallThrough,
                    isNoise: model.IsNoise,
                    partsDelimiterRequired: model.PartsDelimiterRequired,
                    partsMatchMode: model.PartsMatchMode,
                    minMatchedParts: model.MinMatchedParts,
                    cacheable: model.Cacheable,
                    clearCache: model.ClearCache,
                    expressionMode: model.ExpressionMode,
                    expressionOrder: model.ExpressionOrder,
                    boundsAsParts: model.BoundsAsParts,
                    discardBounds: model.DiscardBounds,
                    end: model.End != null ? patternMatcherMap[model.End] : null,
                    partsDelimiter: model.PartsDelimiter != null ? patternMatcherMap[model.PartsDelimiter] : null,
                    partsPadding: model.PartsPadding != null ? patternMatcherMap[model.PartsPadding] : null,
                    start: model.Start != null ? patternMatcherMap[model.Start] : null,
                    negate: model.Negate
                                                            );
                fragmentMatcherMap.Add(fragmentMatcher.Name, fragmentMatcher);
                fragmentMatchers.Add(fragmentMatcher);
            }
            ;

            foreach (FragmentMatcherDefinition model in languageMatcherModel.Fragments)
            {
                FragmentMatcher fragmentMatcher = fragmentMatcherMap[model.Name];
                foreach (IMatcher part in model.Parts.Select(GetPartMatcher))
                {
                    fragmentMatcher.Parts.Add(part);
                }
            }

            FragmentMatcher startingMatcher = fragmentMatcherMap[languageMatcherModel.StartingFragment];

            return(new LanguageMatcher
            {
                Name = languageMatcherModel.Name,
                Fragments = fragmentMatchers,
                Patterns = patternMatchers,
                StartingFragment = startingMatcher,
                LogMatches = languageMatcherModel.LogMatches,
                IndexingMode = languageMatcherModel.IndexingMode
            });

            IMatcher GetPartMatcher(string name)
            {
                return(name.StartsWith("[") ? fragmentMatcherMap[name.Substring(1, name.Length - 2)] : (IMatcher)patternMatcherMap[name]);
            }
        }