Mercurial > pub > ImplabNet
comparison Implab/Formats/Json/JsonGrammar.cs @ 236:302ca905c19e v2
JsonReader optimizations
author | cin |
---|---|
date | Tue, 21 Nov 2017 14:57:58 +0300 |
parents | 3e26338eb977 |
children |
comparison
equal
deleted
inserted
replaced
235:b49969a7043c | 236:302ca905c19e |
---|---|
29 | 29 |
30 public static JsonGrammar Instance { | 30 public static JsonGrammar Instance { |
31 get { return _instance.Value; } | 31 get { return _instance.Value; } |
32 } | 32 } |
33 | 33 |
34 readonly InputScanner<TokenType> m_jsonExpression; | 34 readonly FastInputScanner<TokenType> m_jsonExpression; |
35 readonly InputScanner<TokenType> m_stringExpression; | 35 readonly FastInputScanner<TokenType> m_stringExpression; |
36 readonly CharAlphabet m_defaultAlphabet = new CharAlphabet(); | 36 readonly CharAlphabet m_defaultAlphabet = new CharAlphabet(); |
37 | 37 |
38 public CharAlphabet DefaultAlphabet { get { return m_defaultAlphabet; } } | 38 public CharAlphabet DefaultAlphabet { get { return m_defaultAlphabet; } } |
39 | 39 |
40 public JsonGrammar() { | 40 public JsonGrammar() { |
85 .Or(backSlash.Cat(specialEscapeChars).Tag(TokenType.EscapedChar)) | 85 .Or(backSlash.Cat(specialEscapeChars).Tag(TokenType.EscapedChar)) |
86 .Or(backSlash.Cat(unicodeEspace).Tag(TokenType.EscapedUnicode)) | 86 .Or(backSlash.Cat(unicodeEspace).Tag(TokenType.EscapedUnicode)) |
87 .Or(unescaped.Closure().Tag(TokenType.UnescapedChar)); | 87 .Or(unescaped.Closure().Tag(TokenType.UnescapedChar)); |
88 | 88 |
89 | 89 |
90 m_jsonExpression = BuildScanner(jsonExpression); | 90 m_jsonExpression = BuildFastScanner(jsonExpression); |
91 m_stringExpression = BuildScanner(jsonStringExpression); | 91 m_stringExpression = BuildFastScanner(jsonStringExpression); |
92 } | 92 } |
93 | 93 |
94 public static InputScanner<TokenType> CreateJsonExpressionScanner() { | 94 public static FastInputScanner<TokenType> CreateJsonExpressionScanner() { |
95 return Instance.m_jsonExpression.Clone(); | 95 return Instance.m_jsonExpression.Clone(); |
96 } | 96 } |
97 | 97 |
98 public static InputScanner<TokenType> CreateStringExpressionScanner() { | 98 public static FastInputScanner<TokenType> CreateStringExpressionScanner() { |
99 return Instance.m_stringExpression.Clone(); | 99 return Instance.m_stringExpression.Clone(); |
100 } | 100 } |
101 | 101 |
102 protected override IAlphabetBuilder<char> AlphabetBuilder { | 102 protected override IAlphabetBuilder<char> AlphabetBuilder { |
103 get { | 103 get { |
107 | 107 |
108 Token SymbolRangeToken(char start, char stop) { | 108 Token SymbolRangeToken(char start, char stop) { |
109 return SymbolToken(Enumerable.Range(start, stop - start + 1).Select(x => (char)x)); | 109 return SymbolToken(Enumerable.Range(start, stop - start + 1).Select(x => (char)x)); |
110 } | 110 } |
111 | 111 |
112 public InputScanner<TokenType> BuildScanner(Token regexp) { | 112 public FastInputScanner<TokenType> BuildFastScanner(Token regexp) { |
113 var dfa = new RegularDFA<char, TokenType>(AlphabetBuilder); | 113 var dfa = new RegularDFA<char, TokenType>(AlphabetBuilder); |
114 | 114 |
115 var visitor = new RegularExpressionVisitor<TokenType>(dfa); | 115 var visitor = new RegularExpressionVisitor<TokenType>(dfa); |
116 regexp.Accept(visitor); | 116 regexp.Accept(visitor); |
117 visitor.BuildDFA(); | 117 visitor.BuildDFA(); |
120 throw new ApplicationException("The specified language contains empty token"); | 120 throw new ApplicationException("The specified language contains empty token"); |
121 | 121 |
122 var ab = new CharAlphabet(); | 122 var ab = new CharAlphabet(); |
123 var optimal = dfa.Optimize(ab); | 123 var optimal = dfa.Optimize(ab); |
124 | 124 |
125 return new InputScanner<TokenType>( | 125 return new FastInputScanner<TokenType>( |
126 optimal.CreateTransitionTable(), | 126 optimal.CreateTransitionTable(), |
127 optimal.CreateFinalStateTable(), | 127 optimal.CreateFinalStateTable(), |
128 NormalizeTags(optimal.CreateTagTable()), | 128 NormalizeTags(optimal.CreateTagTable()), |
129 optimal.InitialState, | 129 optimal.InitialState, |
130 ab.CreateCharMap() | 130 ab.GetTranslationMap() |
131 ); | 131 ); |
132 } | 132 } |
133 | 133 |
134 static TokenType[] NormalizeTags(TokenType[][] tags) { | 134 static TokenType[] NormalizeTags(TokenType[][] tags) { |
135 var result = new TokenType[tags.Length]; | 135 var result = new TokenType[tags.Length]; |