Mercurial > pub > ImplabNet
comparison Implab/JSON/JSONScanner.cs @ 60:10c7337d29e7
+JSONXmlReaderOptions
*JSONScanner: fixed reading from TextReader
*code cleanup
author | cin |
---|---|
date | Thu, 19 Jun 2014 03:41:28 +0400 |
parents | c0bf853aa04f |
children | 130781364799 |
comparison
equal
deleted
inserted
replaced
59:21611344d366 | 60:10c7337d29e7 |
---|---|
6 using System.Text; | 6 using System.Text; |
7 using System.Threading.Tasks; | 7 using System.Threading.Tasks; |
8 | 8 |
9 namespace Implab.JSON { | 9 namespace Implab.JSON { |
10 /// <summary> | 10 /// <summary> |
11 /// Сканнер, разбивающий поток символов на токены JSON. | 11 /// Сканнер (лексер), разбивающий поток символов на токены JSON. |
12 /// </summary> | 12 /// </summary> |
13 public class JSONScanner : Scanner { | 13 public class JSONScanner : Scanner { |
14 char[] m_stringBuffer; | 14 char[] m_stringBuffer; |
15 DFAStateDescriptior[] m_stringDFA; | 15 DFAStateDescriptior[] m_stringDFA; |
16 int[] m_stringAlphabet; | 16 int[] m_stringAlphabet; |
17 | 17 |
18 /// <summary> | |
19 /// Создает новый экземпляр сканнера | |
20 /// </summary> | |
18 public JSONScanner() | 21 public JSONScanner() |
19 : base(JSONGrammar.Instance.JsonDFA) { | 22 : base(JSONGrammar.Instance.JsonDFA) { |
20 m_stringBuffer = new char[1024]; | 23 m_stringBuffer = new char[1024]; |
21 var dfa = JSONGrammar.Instance.JsonStringDFA; | 24 var dfa = JSONGrammar.Instance.JsonStringDFA; |
22 m_stringAlphabet = dfa.Alphabet.GetTranslationMap(); | 25 m_stringAlphabet = dfa.Alphabet.GetTranslationMap(); |
23 m_stringDFA = dfa.States; | 26 m_stringDFA = dfa.States; |
24 } | 27 } |
25 | 28 |
29 /// <summary> | |
30 /// Читает следующий лексический элемент из входных данных. | |
31 /// </summary> | |
32 /// <param name="tokenValue">Возвращает значение прочитанного токена.</param> | |
33 /// <param name="tokenType">Возвращает тип прочитанного токена.</param> | |
34 /// <returns><c>true</c> - чтение произведено успешно. <c>false</c> - достигнут конец входных данных</returns> | |
35 /// <remarks>В случе если токен не распознается, возникает исключение. Значения токенов обрабатываются, т.е. | |
36 /// в строках обрабатываются экранированные символы, числа становтся типа double.</remarks> | |
26 public bool ReadToken(out object tokenValue, out JsonTokenType tokenType) { | 37 public bool ReadToken(out object tokenValue, out JsonTokenType tokenType) { |
27 if (ReadTokenInternal()) { | 38 if (ReadTokenInternal()) { |
28 switch ((JSONGrammar.TokenType)m_currentState.tag[0]) { | 39 switch ((JSONGrammar.TokenType)m_currentState.tag[0]) { |
29 case JSONGrammar.TokenType.StringBound: | 40 case JSONGrammar.TokenType.StringBound: |
30 tokenValue = ReadString(); | 41 tokenValue = ReadString(); |