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 | } |