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(); |
