Statistics
| Branch: | Tag: | Revision:

root / Assets / Plugins / LitJson / JsonReader.cs @ 11:01dde4258840

History | View | Annotate | Download (13.5 kB)

1 11:01dde4258840 gershon
#region Header
2 11:01dde4258840 gershon
/**
3 11:01dde4258840 gershon
 * JsonReader.cs
4 11:01dde4258840 gershon
 *   Stream-like access to JSON text.
5 11:01dde4258840 gershon
 *
6 11:01dde4258840 gershon
 * The authors disclaim copyright to this source code. For more details, see
7 11:01dde4258840 gershon
 * the COPYING file included with this distribution.
8 11:01dde4258840 gershon
 **/
9 11:01dde4258840 gershon
#endregion
10 11:01dde4258840 gershon
11 11:01dde4258840 gershon
12 11:01dde4258840 gershon
using System;
13 11:01dde4258840 gershon
using System.Collections.Generic;
14 11:01dde4258840 gershon
using System.IO;
15 11:01dde4258840 gershon
using System.Text;
16 11:01dde4258840 gershon
17 11:01dde4258840 gershon
18 11:01dde4258840 gershon
namespace LitJson
19 11:01dde4258840 gershon
{
20 11:01dde4258840 gershon
    public enum JsonToken
21 11:01dde4258840 gershon
    {
22 11:01dde4258840 gershon
        None,
23 11:01dde4258840 gershon
24 11:01dde4258840 gershon
        ObjectStart,
25 11:01dde4258840 gershon
        PropertyName,
26 11:01dde4258840 gershon
        ObjectEnd,
27 11:01dde4258840 gershon
28 11:01dde4258840 gershon
        ArrayStart,
29 11:01dde4258840 gershon
        ArrayEnd,
30 11:01dde4258840 gershon
31 11:01dde4258840 gershon
        Int,
32 11:01dde4258840 gershon
        Long,
33 11:01dde4258840 gershon
        Double,
34 11:01dde4258840 gershon
35 11:01dde4258840 gershon
        String,
36 11:01dde4258840 gershon
37 11:01dde4258840 gershon
        Boolean,
38 11:01dde4258840 gershon
        Null
39 11:01dde4258840 gershon
    }
40 11:01dde4258840 gershon
41 11:01dde4258840 gershon
42 11:01dde4258840 gershon
    public class JsonReader
43 11:01dde4258840 gershon
    {
44 11:01dde4258840 gershon
        #region Fields
45 11:01dde4258840 gershon
        private static IDictionary<int, IDictionary<int, int[]>> parse_table;
46 11:01dde4258840 gershon
47 11:01dde4258840 gershon
        private Stack<int>    automaton_stack;
48 11:01dde4258840 gershon
        private int           current_input;
49 11:01dde4258840 gershon
        private int           current_symbol;
50 11:01dde4258840 gershon
        private bool          end_of_json;
51 11:01dde4258840 gershon
        private bool          end_of_input;
52 11:01dde4258840 gershon
        private Lexer         lexer;
53 11:01dde4258840 gershon
        private bool          parser_in_string;
54 11:01dde4258840 gershon
        private bool          parser_return;
55 11:01dde4258840 gershon
        private bool          read_started;
56 11:01dde4258840 gershon
        private TextReader    reader;
57 11:01dde4258840 gershon
        private bool          reader_is_owned;
58 11:01dde4258840 gershon
        private bool          skip_non_members;
59 11:01dde4258840 gershon
        private object        token_value;
60 11:01dde4258840 gershon
        private JsonToken     token;
61 11:01dde4258840 gershon
        #endregion
62 11:01dde4258840 gershon
63 11:01dde4258840 gershon
64 11:01dde4258840 gershon
        #region Public Properties
65 11:01dde4258840 gershon
        public bool AllowComments {
66 11:01dde4258840 gershon
            get { return lexer.AllowComments; }
67 11:01dde4258840 gershon
            set { lexer.AllowComments = value; }
68 11:01dde4258840 gershon
        }
69 11:01dde4258840 gershon
70 11:01dde4258840 gershon
        public bool AllowSingleQuotedStrings {
71 11:01dde4258840 gershon
            get { return lexer.AllowSingleQuotedStrings; }
72 11:01dde4258840 gershon
            set { lexer.AllowSingleQuotedStrings = value; }
73 11:01dde4258840 gershon
        }
74 11:01dde4258840 gershon
75 11:01dde4258840 gershon
        public bool SkipNonMembers {
76 11:01dde4258840 gershon
            get { return skip_non_members; }
77 11:01dde4258840 gershon
            set { skip_non_members = value; }
78 11:01dde4258840 gershon
        }
79 11:01dde4258840 gershon
80 11:01dde4258840 gershon
        public bool EndOfInput {
81 11:01dde4258840 gershon
            get { return end_of_input; }
82 11:01dde4258840 gershon
        }
83 11:01dde4258840 gershon
84 11:01dde4258840 gershon
        public bool EndOfJson {
85 11:01dde4258840 gershon
            get { return end_of_json; }
86 11:01dde4258840 gershon
        }
87 11:01dde4258840 gershon
88 11:01dde4258840 gershon
        public JsonToken Token {
89 11:01dde4258840 gershon
            get { return token; }
90 11:01dde4258840 gershon
        }
91 11:01dde4258840 gershon
92 11:01dde4258840 gershon
        public object Value {
93 11:01dde4258840 gershon
            get { return token_value; }
94 11:01dde4258840 gershon
        }
95 11:01dde4258840 gershon
        #endregion
96 11:01dde4258840 gershon
97 11:01dde4258840 gershon
98 11:01dde4258840 gershon
        #region Constructors
99 11:01dde4258840 gershon
        static JsonReader ()
100 11:01dde4258840 gershon
        {
101 11:01dde4258840 gershon
            PopulateParseTable ();
102 11:01dde4258840 gershon
        }
103 11:01dde4258840 gershon
104 11:01dde4258840 gershon
        public JsonReader (string json_text) :
105 11:01dde4258840 gershon
            this (new StringReader (json_text), true)
106 11:01dde4258840 gershon
        {
107 11:01dde4258840 gershon
        }
108 11:01dde4258840 gershon
109 11:01dde4258840 gershon
        public JsonReader (TextReader reader) :
110 11:01dde4258840 gershon
            this (reader, false)
111 11:01dde4258840 gershon
        {
112 11:01dde4258840 gershon
        }
113 11:01dde4258840 gershon
114 11:01dde4258840 gershon
        private JsonReader (TextReader reader, bool owned)
115 11:01dde4258840 gershon
        {
116 11:01dde4258840 gershon
            if (reader == null)
117 11:01dde4258840 gershon
                throw new ArgumentNullException ("reader");
118 11:01dde4258840 gershon
119 11:01dde4258840 gershon
            parser_in_string = false;
120 11:01dde4258840 gershon
            parser_return    = false;
121 11:01dde4258840 gershon
122 11:01dde4258840 gershon
            read_started = false;
123 11:01dde4258840 gershon
            automaton_stack = new Stack<int> ();
124 11:01dde4258840 gershon
            automaton_stack.Push ((int) ParserToken.End);
125 11:01dde4258840 gershon
            automaton_stack.Push ((int) ParserToken.Text);
126 11:01dde4258840 gershon
127 11:01dde4258840 gershon
            lexer = new Lexer (reader);
128 11:01dde4258840 gershon
129 11:01dde4258840 gershon
            end_of_input = false;
130 11:01dde4258840 gershon
            end_of_json  = false;
131 11:01dde4258840 gershon
132 11:01dde4258840 gershon
            skip_non_members = true;
133 11:01dde4258840 gershon
134 11:01dde4258840 gershon
            this.reader = reader;
135 11:01dde4258840 gershon
            reader_is_owned = owned;
136 11:01dde4258840 gershon
        }
137 11:01dde4258840 gershon
        #endregion
138 11:01dde4258840 gershon
139 11:01dde4258840 gershon
140 11:01dde4258840 gershon
        #region Static Methods
141 11:01dde4258840 gershon
        private static void PopulateParseTable ()
142 11:01dde4258840 gershon
        {
143 11:01dde4258840 gershon
            // See section A.2. of the manual for details
144 11:01dde4258840 gershon
            parse_table = new Dictionary<int, IDictionary<int, int[]>> ();
145 11:01dde4258840 gershon
146 11:01dde4258840 gershon
            TableAddRow (ParserToken.Array);
147 11:01dde4258840 gershon
            TableAddCol (ParserToken.Array, '[',
148 11:01dde4258840 gershon
                         '[',
149 11:01dde4258840 gershon
                         (int) ParserToken.ArrayPrime);
150 11:01dde4258840 gershon
151 11:01dde4258840 gershon
            TableAddRow (ParserToken.ArrayPrime);
152 11:01dde4258840 gershon
            TableAddCol (ParserToken.ArrayPrime, '"',
153 11:01dde4258840 gershon
                         (int) ParserToken.Value,
154 11:01dde4258840 gershon
155 11:01dde4258840 gershon
                         (int) ParserToken.ValueRest,
156 11:01dde4258840 gershon
                         ']');
157 11:01dde4258840 gershon
            TableAddCol (ParserToken.ArrayPrime, '[',
158 11:01dde4258840 gershon
                         (int) ParserToken.Value,
159 11:01dde4258840 gershon
                         (int) ParserToken.ValueRest,
160 11:01dde4258840 gershon
                         ']');
161 11:01dde4258840 gershon
            TableAddCol (ParserToken.ArrayPrime, ']',
162 11:01dde4258840 gershon
                         ']');
163 11:01dde4258840 gershon
            TableAddCol (ParserToken.ArrayPrime, '{',
164 11:01dde4258840 gershon
                         (int) ParserToken.Value,
165 11:01dde4258840 gershon
                         (int) ParserToken.ValueRest,
166 11:01dde4258840 gershon
                         ']');
167 11:01dde4258840 gershon
            TableAddCol (ParserToken.ArrayPrime, (int) ParserToken.Number,
168 11:01dde4258840 gershon
                         (int) ParserToken.Value,
169 11:01dde4258840 gershon
                         (int) ParserToken.ValueRest,
170 11:01dde4258840 gershon
                         ']');
171 11:01dde4258840 gershon
            TableAddCol (ParserToken.ArrayPrime, (int) ParserToken.True,
172 11:01dde4258840 gershon
                         (int) ParserToken.Value,
173 11:01dde4258840 gershon
                         (int) ParserToken.ValueRest,
174 11:01dde4258840 gershon
                         ']');
175 11:01dde4258840 gershon
            TableAddCol (ParserToken.ArrayPrime, (int) ParserToken.False,
176 11:01dde4258840 gershon
                         (int) ParserToken.Value,
177 11:01dde4258840 gershon
                         (int) ParserToken.ValueRest,
178 11:01dde4258840 gershon
                         ']');
179 11:01dde4258840 gershon
            TableAddCol (ParserToken.ArrayPrime, (int) ParserToken.Null,
180 11:01dde4258840 gershon
                         (int) ParserToken.Value,
181 11:01dde4258840 gershon
                         (int) ParserToken.ValueRest,
182 11:01dde4258840 gershon
                         ']');
183 11:01dde4258840 gershon
184 11:01dde4258840 gershon
            TableAddRow (ParserToken.Object);
185 11:01dde4258840 gershon
            TableAddCol (ParserToken.Object, '{',
186 11:01dde4258840 gershon
                         '{',
187 11:01dde4258840 gershon
                         (int) ParserToken.ObjectPrime);
188 11:01dde4258840 gershon
189 11:01dde4258840 gershon
            TableAddRow (ParserToken.ObjectPrime);
190 11:01dde4258840 gershon
            TableAddCol (ParserToken.ObjectPrime, '"',
191 11:01dde4258840 gershon
                         (int) ParserToken.Pair,
192 11:01dde4258840 gershon
                         (int) ParserToken.PairRest,
193 11:01dde4258840 gershon
                         '}');
194 11:01dde4258840 gershon
            TableAddCol (ParserToken.ObjectPrime, '}',
195 11:01dde4258840 gershon
                         '}');
196 11:01dde4258840 gershon
197 11:01dde4258840 gershon
            TableAddRow (ParserToken.Pair);
198 11:01dde4258840 gershon
            TableAddCol (ParserToken.Pair, '"',
199 11:01dde4258840 gershon
                         (int) ParserToken.String,
200 11:01dde4258840 gershon
                         ':',
201 11:01dde4258840 gershon
                         (int) ParserToken.Value);
202 11:01dde4258840 gershon
203 11:01dde4258840 gershon
            TableAddRow (ParserToken.PairRest);
204 11:01dde4258840 gershon
            TableAddCol (ParserToken.PairRest, ',',
205 11:01dde4258840 gershon
                         ',',
206 11:01dde4258840 gershon
                         (int) ParserToken.Pair,
207 11:01dde4258840 gershon
                         (int) ParserToken.PairRest);
208 11:01dde4258840 gershon
            TableAddCol (ParserToken.PairRest, '}',
209 11:01dde4258840 gershon
                         (int) ParserToken.Epsilon);
210 11:01dde4258840 gershon
211 11:01dde4258840 gershon
            TableAddRow (ParserToken.String);
212 11:01dde4258840 gershon
            TableAddCol (ParserToken.String, '"',
213 11:01dde4258840 gershon
                         '"',
214 11:01dde4258840 gershon
                         (int) ParserToken.CharSeq,
215 11:01dde4258840 gershon
                         '"');
216 11:01dde4258840 gershon
217 11:01dde4258840 gershon
            TableAddRow (ParserToken.Text);
218 11:01dde4258840 gershon
            TableAddCol (ParserToken.Text, '[',
219 11:01dde4258840 gershon
                         (int) ParserToken.Array);
220 11:01dde4258840 gershon
            TableAddCol (ParserToken.Text, '{',
221 11:01dde4258840 gershon
                         (int) ParserToken.Object);
222 11:01dde4258840 gershon
223 11:01dde4258840 gershon
            TableAddRow (ParserToken.Value);
224 11:01dde4258840 gershon
            TableAddCol (ParserToken.Value, '"',
225 11:01dde4258840 gershon
                         (int) ParserToken.String);
226 11:01dde4258840 gershon
            TableAddCol (ParserToken.Value, '[',
227 11:01dde4258840 gershon
                         (int) ParserToken.Array);
228 11:01dde4258840 gershon
            TableAddCol (ParserToken.Value, '{',
229 11:01dde4258840 gershon
                         (int) ParserToken.Object);
230 11:01dde4258840 gershon
            TableAddCol (ParserToken.Value, (int) ParserToken.Number,
231 11:01dde4258840 gershon
                         (int) ParserToken.Number);
232 11:01dde4258840 gershon
            TableAddCol (ParserToken.Value, (int) ParserToken.True,
233 11:01dde4258840 gershon
                         (int) ParserToken.True);
234 11:01dde4258840 gershon
            TableAddCol (ParserToken.Value, (int) ParserToken.False,
235 11:01dde4258840 gershon
                         (int) ParserToken.False);
236 11:01dde4258840 gershon
            TableAddCol (ParserToken.Value, (int) ParserToken.Null,
237 11:01dde4258840 gershon
                         (int) ParserToken.Null);
238 11:01dde4258840 gershon
239 11:01dde4258840 gershon
            TableAddRow (ParserToken.ValueRest);
240 11:01dde4258840 gershon
            TableAddCol (ParserToken.ValueRest, ',',
241 11:01dde4258840 gershon
                         ',',
242 11:01dde4258840 gershon
                         (int) ParserToken.Value,
243 11:01dde4258840 gershon
                         (int) ParserToken.ValueRest);
244 11:01dde4258840 gershon
            TableAddCol (ParserToken.ValueRest, ']',
245 11:01dde4258840 gershon
                         (int) ParserToken.Epsilon);
246 11:01dde4258840 gershon
        }
247 11:01dde4258840 gershon
248 11:01dde4258840 gershon
        private static void TableAddCol (ParserToken row, int col,
249 11:01dde4258840 gershon
                                         params int[] symbols)
250 11:01dde4258840 gershon
        {
251 11:01dde4258840 gershon
            parse_table[(int) row].Add (col, symbols);
252 11:01dde4258840 gershon
        }
253 11:01dde4258840 gershon
254 11:01dde4258840 gershon
        private static void TableAddRow (ParserToken rule)
255 11:01dde4258840 gershon
        {
256 11:01dde4258840 gershon
            parse_table.Add ((int) rule, new Dictionary<int, int[]> ());
257 11:01dde4258840 gershon
        }
258 11:01dde4258840 gershon
        #endregion
259 11:01dde4258840 gershon
260 11:01dde4258840 gershon
261 11:01dde4258840 gershon
        #region Private Methods
262 11:01dde4258840 gershon
        private void ProcessNumber (string number)
263 11:01dde4258840 gershon
        {
264 11:01dde4258840 gershon
            if (number.IndexOf ('.') != -1 ||
265 11:01dde4258840 gershon
                number.IndexOf ('e') != -1 ||
266 11:01dde4258840 gershon
                number.IndexOf ('E') != -1) {
267 11:01dde4258840 gershon
268 11:01dde4258840 gershon
                double n_double;
269 11:01dde4258840 gershon
                if (Double.TryParse (number, out n_double)) {
270 11:01dde4258840 gershon
                    token = JsonToken.Double;
271 11:01dde4258840 gershon
                    token_value = n_double;
272 11:01dde4258840 gershon
273 11:01dde4258840 gershon
                    return;
274 11:01dde4258840 gershon
                }
275 11:01dde4258840 gershon
            }
276 11:01dde4258840 gershon
277 11:01dde4258840 gershon
            int n_int32;
278 11:01dde4258840 gershon
            if (Int32.TryParse (number, out n_int32)) {
279 11:01dde4258840 gershon
                token = JsonToken.Int;
280 11:01dde4258840 gershon
                token_value = n_int32;
281 11:01dde4258840 gershon
282 11:01dde4258840 gershon
                return;
283 11:01dde4258840 gershon
            }
284 11:01dde4258840 gershon
285 11:01dde4258840 gershon
            long n_int64;
286 11:01dde4258840 gershon
            if (Int64.TryParse (number, out n_int64)) {
287 11:01dde4258840 gershon
                token = JsonToken.Long;
288 11:01dde4258840 gershon
                token_value = n_int64;
289 11:01dde4258840 gershon
290 11:01dde4258840 gershon
                return;
291 11:01dde4258840 gershon
            }
292 11:01dde4258840 gershon
293 11:01dde4258840 gershon
            // Shouldn't happen, but just in case, return something
294 11:01dde4258840 gershon
            token = JsonToken.Int;
295 11:01dde4258840 gershon
            token_value = 0;
296 11:01dde4258840 gershon
        }
297 11:01dde4258840 gershon
298 11:01dde4258840 gershon
        private void ProcessSymbol ()
299 11:01dde4258840 gershon
        {
300 11:01dde4258840 gershon
            if (current_symbol == '[')  {
301 11:01dde4258840 gershon
                token = JsonToken.ArrayStart;
302 11:01dde4258840 gershon
                parser_return = true;
303 11:01dde4258840 gershon
304 11:01dde4258840 gershon
            } else if (current_symbol == ']')  {
305 11:01dde4258840 gershon
                token = JsonToken.ArrayEnd;
306 11:01dde4258840 gershon
                parser_return = true;
307 11:01dde4258840 gershon
308 11:01dde4258840 gershon
            } else if (current_symbol == '{')  {
309 11:01dde4258840 gershon
                token = JsonToken.ObjectStart;
310 11:01dde4258840 gershon
                parser_return = true;
311 11:01dde4258840 gershon
312 11:01dde4258840 gershon
            } else if (current_symbol == '}')  {
313 11:01dde4258840 gershon
                token = JsonToken.ObjectEnd;
314 11:01dde4258840 gershon
                parser_return = true;
315 11:01dde4258840 gershon
316 11:01dde4258840 gershon
            } else if (current_symbol == '"')  {
317 11:01dde4258840 gershon
                if (parser_in_string) {
318 11:01dde4258840 gershon
                    parser_in_string = false;
319 11:01dde4258840 gershon
320 11:01dde4258840 gershon
                    parser_return = true;
321 11:01dde4258840 gershon
322 11:01dde4258840 gershon
                } else {
323 11:01dde4258840 gershon
                    if (token == JsonToken.None)
324 11:01dde4258840 gershon
                        token = JsonToken.String;
325 11:01dde4258840 gershon
326 11:01dde4258840 gershon
                    parser_in_string = true;
327 11:01dde4258840 gershon
                }
328 11:01dde4258840 gershon
329 11:01dde4258840 gershon
            } else if (current_symbol == (int) ParserToken.CharSeq) {
330 11:01dde4258840 gershon
                token_value = lexer.StringValue;
331 11:01dde4258840 gershon
332 11:01dde4258840 gershon
            } else if (current_symbol == (int) ParserToken.False)  {
333 11:01dde4258840 gershon
                token = JsonToken.Boolean;
334 11:01dde4258840 gershon
                token_value = false;
335 11:01dde4258840 gershon
                parser_return = true;
336 11:01dde4258840 gershon
337 11:01dde4258840 gershon
            } else if (current_symbol == (int) ParserToken.Null)  {
338 11:01dde4258840 gershon
                token = JsonToken.Null;
339 11:01dde4258840 gershon
                parser_return = true;
340 11:01dde4258840 gershon
341 11:01dde4258840 gershon
            } else if (current_symbol == (int) ParserToken.Number)  {
342 11:01dde4258840 gershon
                ProcessNumber (lexer.StringValue);
343 11:01dde4258840 gershon
344 11:01dde4258840 gershon
                parser_return = true;
345 11:01dde4258840 gershon
346 11:01dde4258840 gershon
            } else if (current_symbol == (int) ParserToken.Pair)  {
347 11:01dde4258840 gershon
                token = JsonToken.PropertyName;
348 11:01dde4258840 gershon
349 11:01dde4258840 gershon
            } else if (current_symbol == (int) ParserToken.True)  {
350 11:01dde4258840 gershon
                token = JsonToken.Boolean;
351 11:01dde4258840 gershon
                token_value = true;
352 11:01dde4258840 gershon
                parser_return = true;
353 11:01dde4258840 gershon
354 11:01dde4258840 gershon
            }
355 11:01dde4258840 gershon
        }
356 11:01dde4258840 gershon
357 11:01dde4258840 gershon
        private bool ReadToken ()
358 11:01dde4258840 gershon
        {
359 11:01dde4258840 gershon
            if (end_of_input)
360 11:01dde4258840 gershon
                return false;
361 11:01dde4258840 gershon
362 11:01dde4258840 gershon
            lexer.NextToken ();
363 11:01dde4258840 gershon
364 11:01dde4258840 gershon
            if (lexer.EndOfInput) {
365 11:01dde4258840 gershon
                Close ();
366 11:01dde4258840 gershon
367 11:01dde4258840 gershon
                return false;
368 11:01dde4258840 gershon
            }
369 11:01dde4258840 gershon
370 11:01dde4258840 gershon
            current_input = lexer.Token;
371 11:01dde4258840 gershon
372 11:01dde4258840 gershon
            return true;
373 11:01dde4258840 gershon
        }
374 11:01dde4258840 gershon
        #endregion
375 11:01dde4258840 gershon
376 11:01dde4258840 gershon
377 11:01dde4258840 gershon
        public void Close ()
378 11:01dde4258840 gershon
        {
379 11:01dde4258840 gershon
            if (end_of_input)
380 11:01dde4258840 gershon
                return;
381 11:01dde4258840 gershon
382 11:01dde4258840 gershon
            end_of_input = true;
383 11:01dde4258840 gershon
            end_of_json  = true;
384 11:01dde4258840 gershon
385 11:01dde4258840 gershon
            if (reader_is_owned)
386 11:01dde4258840 gershon
                reader.Close ();
387 11:01dde4258840 gershon
388 11:01dde4258840 gershon
            reader = null;
389 11:01dde4258840 gershon
        }
390 11:01dde4258840 gershon
391 11:01dde4258840 gershon
        public bool Read ()
392 11:01dde4258840 gershon
        {
393 11:01dde4258840 gershon
            if (end_of_input)
394 11:01dde4258840 gershon
                return false;
395 11:01dde4258840 gershon
396 11:01dde4258840 gershon
            if (end_of_json) {
397 11:01dde4258840 gershon
                end_of_json = false;
398 11:01dde4258840 gershon
                automaton_stack.Clear ();
399 11:01dde4258840 gershon
                automaton_stack.Push ((int) ParserToken.End);
400 11:01dde4258840 gershon
                automaton_stack.Push ((int) ParserToken.Text);
401 11:01dde4258840 gershon
            }
402 11:01dde4258840 gershon
403 11:01dde4258840 gershon
            parser_in_string = false;
404 11:01dde4258840 gershon
            parser_return    = false;
405 11:01dde4258840 gershon
406 11:01dde4258840 gershon
            token       = JsonToken.None;
407 11:01dde4258840 gershon
            token_value = null;
408 11:01dde4258840 gershon
409 11:01dde4258840 gershon
            if (! read_started) {
410 11:01dde4258840 gershon
                read_started = true;
411 11:01dde4258840 gershon
412 11:01dde4258840 gershon
                if (! ReadToken ())
413 11:01dde4258840 gershon
                    return false;
414 11:01dde4258840 gershon
            }
415 11:01dde4258840 gershon
416 11:01dde4258840 gershon
417 11:01dde4258840 gershon
            int[] entry_symbols;
418 11:01dde4258840 gershon
419 11:01dde4258840 gershon
            while (true) {
420 11:01dde4258840 gershon
                if (parser_return) {
421 11:01dde4258840 gershon
                    if (automaton_stack.Peek () == (int) ParserToken.End)
422 11:01dde4258840 gershon
                        end_of_json = true;
423 11:01dde4258840 gershon
424 11:01dde4258840 gershon
                    return true;
425 11:01dde4258840 gershon
                }
426 11:01dde4258840 gershon
427 11:01dde4258840 gershon
                current_symbol = automaton_stack.Pop ();
428 11:01dde4258840 gershon
429 11:01dde4258840 gershon
                ProcessSymbol ();
430 11:01dde4258840 gershon
431 11:01dde4258840 gershon
                if (current_symbol == current_input) {
432 11:01dde4258840 gershon
                    if (! ReadToken ()) {
433 11:01dde4258840 gershon
                        if (automaton_stack.Peek () != (int) ParserToken.End)
434 11:01dde4258840 gershon
                            throw new JsonException (
435 11:01dde4258840 gershon
                                "Input doesn't evaluate to proper JSON text");
436 11:01dde4258840 gershon
437 11:01dde4258840 gershon
                        if (parser_return)
438 11:01dde4258840 gershon
                            return true;
439 11:01dde4258840 gershon
440 11:01dde4258840 gershon
                        return false;
441 11:01dde4258840 gershon
                    }
442 11:01dde4258840 gershon
443 11:01dde4258840 gershon
                    continue;
444 11:01dde4258840 gershon
                }
445 11:01dde4258840 gershon
446 11:01dde4258840 gershon
                try {
447 11:01dde4258840 gershon
448 11:01dde4258840 gershon
                    entry_symbols =
449 11:01dde4258840 gershon
                        parse_table[current_symbol][current_input];
450 11:01dde4258840 gershon
451 11:01dde4258840 gershon
                } catch (KeyNotFoundException e) {
452 11:01dde4258840 gershon
                    throw new JsonException ((ParserToken) current_input, e);
453 11:01dde4258840 gershon
                }
454 11:01dde4258840 gershon
455 11:01dde4258840 gershon
                if (entry_symbols[0] == (int) ParserToken.Epsilon)
456 11:01dde4258840 gershon
                    continue;
457 11:01dde4258840 gershon
458 11:01dde4258840 gershon
                for (int i = entry_symbols.Length - 1; i >= 0; i--)
459 11:01dde4258840 gershon
                    automaton_stack.Push (entry_symbols[i]);
460 11:01dde4258840 gershon
            }
461 11:01dde4258840 gershon
        }
462 11:01dde4258840 gershon
463 11:01dde4258840 gershon
    }
464 11:01dde4258840 gershon
}