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