Mercurial > pub > ImplabNet
comparison Implab/Formats/Json/JsonScanner.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 |
|---|---|
| 8 namespace Implab.Formats.Json { | 8 namespace Implab.Formats.Json { |
| 9 /// <summary> | 9 /// <summary> |
| 10 /// Сканнер (лексер), разбивающий поток символов на токены JSON. | 10 /// Сканнер (лексер), разбивающий поток символов на токены JSON. |
| 11 /// </summary> | 11 /// </summary> |
| 12 public abstract class JsonScanner : Disposable { | 12 public abstract class JsonScanner : Disposable { |
| 13 readonly InputScanner<JsonGrammar.TokenType> m_jsonContext = JsonGrammar.CreateJsonExpressionScanner(); | 13 readonly FastInputScanner<JsonGrammar.TokenType> m_jsonContext = JsonGrammar.CreateJsonExpressionScanner(); |
| 14 readonly InputScanner<JsonGrammar.TokenType> m_stringContext = JsonGrammar.CreateStringExpressionScanner(); | 14 readonly FastInputScanner<JsonGrammar.TokenType> m_stringContext = JsonGrammar.CreateStringExpressionScanner(); |
| 15 | 15 |
| 16 readonly char[] m_unescapeBuf = new char[4]; | 16 readonly char[] m_unescapeBuf = new char[4]; |
| 17 readonly char[] m_buffer; | 17 readonly char[] m_buffer; |
| 18 int m_length; | 18 int m_length; |
| 19 int m_pos; | 19 int m_pos; |
| 23 m_buffer = buffer; | 23 m_buffer = buffer; |
| 24 m_pos = pos; | 24 m_pos = pos; |
| 25 m_length = length; | 25 m_length = length; |
| 26 } | 26 } |
| 27 | 27 |
| 28 bool ReadChunk(InputScanner<JsonGrammar.TokenType> scanner, out JsonGrammar.TokenType tokenType) { | 28 bool ReadChunk(FastInputScanner<JsonGrammar.TokenType> scanner, out JsonGrammar.TokenType tokenType) { |
| 29 scanner.ResetState(); | 29 scanner.ResetState(); |
| 30 | 30 |
| 31 while(scanner.Scan(m_buffer, m_pos, m_length)) { | 31 while(scanner.Scan(m_buffer, m_pos, m_length)) { |
| 32 // scanner requests new data | 32 // scanner requests new data |
| 33 | 33 |
| 69 | 69 |
| 70 m_pos = scannerPos; | 70 m_pos = scannerPos; |
| 71 return true; | 71 return true; |
| 72 } | 72 } |
| 73 | 73 |
| 74 bool ReadStringChunk(InputScanner<JsonGrammar.TokenType> scanner, out JsonGrammar.TokenType tokenType) { | 74 bool ReadStringChunk(FastInputScanner<JsonGrammar.TokenType> scanner, out JsonGrammar.TokenType tokenType) { |
| 75 scanner.ResetState(); | 75 scanner.ResetState(); |
| 76 | 76 |
| 77 while (scanner.Scan(m_buffer, m_pos, m_length)) { | 77 while (scanner.Scan(m_buffer, m_pos, m_length)) { |
| 78 // scanner requests new data | 78 // scanner requests new data |
| 79 | 79 |
| 105 } | 105 } |
| 106 var scannerPos = scanner.Position; | 106 var scannerPos = scanner.Position; |
| 107 | 107 |
| 108 // scanner stops as scannerPos | 108 // scanner stops as scannerPos |
| 109 if (!scanner.IsFinal) | 109 if (!scanner.IsFinal) |
| 110 throw new ParserException($"Unexpected character '{m_buffer[scannerPos + 1]}'"); | 110 throw new ParserException($"Unexpected character '{m_buffer[scannerPos]}'"); |
| 111 | 111 |
| 112 if (scannerPos != m_pos) { | 112 if (scannerPos != m_pos) { |
| 113 m_tokenBuilder.Append(m_buffer, m_pos, scannerPos - m_pos); | 113 m_tokenBuilder.Append(m_buffer, m_pos, scannerPos - m_pos); |
| 114 m_pos = scannerPos; | 114 m_pos = scannerPos; |
| 115 } | 115 } |
