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