root / Assets / Plugins / LitJson / Lexer.cs @ 11:01dde4258840
History | View | Annotate | Download (22.6 kB)
1 | 11:01dde4258840 | gershon | #region Header |
---|---|---|---|
2 | 11:01dde4258840 | gershon | /** |
3 | 11:01dde4258840 | gershon | * Lexer.cs |
4 | 11:01dde4258840 | gershon | * JSON lexer implementation based on a finite state machine. |
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 | internal class FsmContext |
21 | 11:01dde4258840 | gershon | { |
22 | 11:01dde4258840 | gershon | public bool Return; |
23 | 11:01dde4258840 | gershon | public int NextState; |
24 | 11:01dde4258840 | gershon | public Lexer L; |
25 | 11:01dde4258840 | gershon | public int StateStack; |
26 | 11:01dde4258840 | gershon | } |
27 | 11:01dde4258840 | gershon | |
28 | 11:01dde4258840 | gershon | |
29 | 11:01dde4258840 | gershon | internal class Lexer |
30 | 11:01dde4258840 | gershon | { |
31 | 11:01dde4258840 | gershon | #region Fields |
32 | 11:01dde4258840 | gershon | private delegate bool StateHandler (FsmContext ctx); |
33 | 11:01dde4258840 | gershon | |
34 | 11:01dde4258840 | gershon | private static int[] fsm_return_table; |
35 | 11:01dde4258840 | gershon | private static StateHandler[] fsm_handler_table; |
36 | 11:01dde4258840 | gershon | |
37 | 11:01dde4258840 | gershon | private bool allow_comments; |
38 | 11:01dde4258840 | gershon | private bool allow_single_quoted_strings; |
39 | 11:01dde4258840 | gershon | private bool end_of_input; |
40 | 11:01dde4258840 | gershon | private FsmContext fsm_context; |
41 | 11:01dde4258840 | gershon | private int input_buffer; |
42 | 11:01dde4258840 | gershon | private int input_char; |
43 | 11:01dde4258840 | gershon | private TextReader reader; |
44 | 11:01dde4258840 | gershon | private int state; |
45 | 11:01dde4258840 | gershon | private StringBuilder string_buffer; |
46 | 11:01dde4258840 | gershon | private string string_value; |
47 | 11:01dde4258840 | gershon | private int token; |
48 | 11:01dde4258840 | gershon | private int unichar; |
49 | 11:01dde4258840 | gershon | #endregion |
50 | 11:01dde4258840 | gershon | |
51 | 11:01dde4258840 | gershon | |
52 | 11:01dde4258840 | gershon | #region Properties |
53 | 11:01dde4258840 | gershon | public bool AllowComments { |
54 | 11:01dde4258840 | gershon | get { return allow_comments; } |
55 | 11:01dde4258840 | gershon | set { allow_comments = value; } |
56 | 11:01dde4258840 | gershon | } |
57 | 11:01dde4258840 | gershon | |
58 | 11:01dde4258840 | gershon | public bool AllowSingleQuotedStrings { |
59 | 11:01dde4258840 | gershon | get { return allow_single_quoted_strings; } |
60 | 11:01dde4258840 | gershon | set { allow_single_quoted_strings = value; } |
61 | 11:01dde4258840 | gershon | } |
62 | 11:01dde4258840 | gershon | |
63 | 11:01dde4258840 | gershon | public bool EndOfInput { |
64 | 11:01dde4258840 | gershon | get { return end_of_input; } |
65 | 11:01dde4258840 | gershon | } |
66 | 11:01dde4258840 | gershon | |
67 | 11:01dde4258840 | gershon | public int Token { |
68 | 11:01dde4258840 | gershon | get { return token; } |
69 | 11:01dde4258840 | gershon | } |
70 | 11:01dde4258840 | gershon | |
71 | 11:01dde4258840 | gershon | public string StringValue { |
72 | 11:01dde4258840 | gershon | get { return string_value; } |
73 | 11:01dde4258840 | gershon | } |
74 | 11:01dde4258840 | gershon | #endregion |
75 | 11:01dde4258840 | gershon | |
76 | 11:01dde4258840 | gershon | |
77 | 11:01dde4258840 | gershon | #region Constructors |
78 | 11:01dde4258840 | gershon | static Lexer () |
79 | 11:01dde4258840 | gershon | { |
80 | 11:01dde4258840 | gershon | PopulateFsmTables (); |
81 | 11:01dde4258840 | gershon | } |
82 | 11:01dde4258840 | gershon | |
83 | 11:01dde4258840 | gershon | public Lexer (TextReader reader) |
84 | 11:01dde4258840 | gershon | { |
85 | 11:01dde4258840 | gershon | allow_comments = true; |
86 | 11:01dde4258840 | gershon | allow_single_quoted_strings = true; |
87 | 11:01dde4258840 | gershon | |
88 | 11:01dde4258840 | gershon | input_buffer = 0; |
89 | 11:01dde4258840 | gershon | string_buffer = new StringBuilder (128); |
90 | 11:01dde4258840 | gershon | state = 1; |
91 | 11:01dde4258840 | gershon | end_of_input = false; |
92 | 11:01dde4258840 | gershon | this.reader = reader; |
93 | 11:01dde4258840 | gershon | |
94 | 11:01dde4258840 | gershon | fsm_context = new FsmContext (); |
95 | 11:01dde4258840 | gershon | fsm_context.L = this; |
96 | 11:01dde4258840 | gershon | } |
97 | 11:01dde4258840 | gershon | #endregion |
98 | 11:01dde4258840 | gershon | |
99 | 11:01dde4258840 | gershon | |
100 | 11:01dde4258840 | gershon | #region Static Methods |
101 | 11:01dde4258840 | gershon | private static int HexValue (int digit) |
102 | 11:01dde4258840 | gershon | { |
103 | 11:01dde4258840 | gershon | switch (digit) { |
104 | 11:01dde4258840 | gershon | case 'a': |
105 | 11:01dde4258840 | gershon | case 'A': |
106 | 11:01dde4258840 | gershon | return 10; |
107 | 11:01dde4258840 | gershon | |
108 | 11:01dde4258840 | gershon | case 'b': |
109 | 11:01dde4258840 | gershon | case 'B': |
110 | 11:01dde4258840 | gershon | return 11; |
111 | 11:01dde4258840 | gershon | |
112 | 11:01dde4258840 | gershon | case 'c': |
113 | 11:01dde4258840 | gershon | case 'C': |
114 | 11:01dde4258840 | gershon | return 12; |
115 | 11:01dde4258840 | gershon | |
116 | 11:01dde4258840 | gershon | case 'd': |
117 | 11:01dde4258840 | gershon | case 'D': |
118 | 11:01dde4258840 | gershon | return 13; |
119 | 11:01dde4258840 | gershon | |
120 | 11:01dde4258840 | gershon | case 'e': |
121 | 11:01dde4258840 | gershon | case 'E': |
122 | 11:01dde4258840 | gershon | return 14; |
123 | 11:01dde4258840 | gershon | |
124 | 11:01dde4258840 | gershon | case 'f': |
125 | 11:01dde4258840 | gershon | case 'F': |
126 | 11:01dde4258840 | gershon | return 15; |
127 | 11:01dde4258840 | gershon | |
128 | 11:01dde4258840 | gershon | default: |
129 | 11:01dde4258840 | gershon | return digit - '0'; |
130 | 11:01dde4258840 | gershon | } |
131 | 11:01dde4258840 | gershon | } |
132 | 11:01dde4258840 | gershon | |
133 | 11:01dde4258840 | gershon | private static void PopulateFsmTables () |
134 | 11:01dde4258840 | gershon | { |
135 | 11:01dde4258840 | gershon | // See section A.1. of the manual for details of the finite |
136 | 11:01dde4258840 | gershon | // state machine. |
137 | 11:01dde4258840 | gershon | fsm_handler_table = new StateHandler[28] { |
138 | 11:01dde4258840 | gershon | State1, |
139 | 11:01dde4258840 | gershon | State2, |
140 | 11:01dde4258840 | gershon | State3, |
141 | 11:01dde4258840 | gershon | State4, |
142 | 11:01dde4258840 | gershon | State5, |
143 | 11:01dde4258840 | gershon | State6, |
144 | 11:01dde4258840 | gershon | State7, |
145 | 11:01dde4258840 | gershon | State8, |
146 | 11:01dde4258840 | gershon | State9, |
147 | 11:01dde4258840 | gershon | State10, |
148 | 11:01dde4258840 | gershon | State11, |
149 | 11:01dde4258840 | gershon | State12, |
150 | 11:01dde4258840 | gershon | State13, |
151 | 11:01dde4258840 | gershon | State14, |
152 | 11:01dde4258840 | gershon | State15, |
153 | 11:01dde4258840 | gershon | State16, |
154 | 11:01dde4258840 | gershon | State17, |
155 | 11:01dde4258840 | gershon | State18, |
156 | 11:01dde4258840 | gershon | State19, |
157 | 11:01dde4258840 | gershon | State20, |
158 | 11:01dde4258840 | gershon | State21, |
159 | 11:01dde4258840 | gershon | State22, |
160 | 11:01dde4258840 | gershon | State23, |
161 | 11:01dde4258840 | gershon | State24, |
162 | 11:01dde4258840 | gershon | State25, |
163 | 11:01dde4258840 | gershon | State26, |
164 | 11:01dde4258840 | gershon | State27, |
165 | 11:01dde4258840 | gershon | State28 |
166 | 11:01dde4258840 | gershon | }; |
167 | 11:01dde4258840 | gershon | |
168 | 11:01dde4258840 | gershon | fsm_return_table = new int[28] { |
169 | 11:01dde4258840 | gershon | (int) ParserToken.Char, |
170 | 11:01dde4258840 | gershon | 0, |
171 | 11:01dde4258840 | gershon | (int) ParserToken.Number, |
172 | 11:01dde4258840 | gershon | (int) ParserToken.Number, |
173 | 11:01dde4258840 | gershon | 0, |
174 | 11:01dde4258840 | gershon | (int) ParserToken.Number, |
175 | 11:01dde4258840 | gershon | 0, |
176 | 11:01dde4258840 | gershon | (int) ParserToken.Number, |
177 | 11:01dde4258840 | gershon | 0, |
178 | 11:01dde4258840 | gershon | 0, |
179 | 11:01dde4258840 | gershon | (int) ParserToken.True, |
180 | 11:01dde4258840 | gershon | 0, |
181 | 11:01dde4258840 | gershon | 0, |
182 | 11:01dde4258840 | gershon | 0, |
183 | 11:01dde4258840 | gershon | (int) ParserToken.False, |
184 | 11:01dde4258840 | gershon | 0, |
185 | 11:01dde4258840 | gershon | 0, |
186 | 11:01dde4258840 | gershon | (int) ParserToken.Null, |
187 | 11:01dde4258840 | gershon | (int) ParserToken.CharSeq, |
188 | 11:01dde4258840 | gershon | (int) ParserToken.Char, |
189 | 11:01dde4258840 | gershon | 0, |
190 | 11:01dde4258840 | gershon | 0, |
191 | 11:01dde4258840 | gershon | (int) ParserToken.CharSeq, |
192 | 11:01dde4258840 | gershon | (int) ParserToken.Char, |
193 | 11:01dde4258840 | gershon | 0, |
194 | 11:01dde4258840 | gershon | 0, |
195 | 11:01dde4258840 | gershon | 0, |
196 | 11:01dde4258840 | gershon | 0 |
197 | 11:01dde4258840 | gershon | }; |
198 | 11:01dde4258840 | gershon | } |
199 | 11:01dde4258840 | gershon | |
200 | 11:01dde4258840 | gershon | private static char ProcessEscChar (int esc_char) |
201 | 11:01dde4258840 | gershon | { |
202 | 11:01dde4258840 | gershon | switch (esc_char) { |
203 | 11:01dde4258840 | gershon | case '"': |
204 | 11:01dde4258840 | gershon | case '\'': |
205 | 11:01dde4258840 | gershon | case '\\': |
206 | 11:01dde4258840 | gershon | case '/': |
207 | 11:01dde4258840 | gershon | return Convert.ToChar (esc_char); |
208 | 11:01dde4258840 | gershon | |
209 | 11:01dde4258840 | gershon | case 'n': |
210 | 11:01dde4258840 | gershon | return '\n'; |
211 | 11:01dde4258840 | gershon | |
212 | 11:01dde4258840 | gershon | case 't': |
213 | 11:01dde4258840 | gershon | return '\t'; |
214 | 11:01dde4258840 | gershon | |
215 | 11:01dde4258840 | gershon | case 'r': |
216 | 11:01dde4258840 | gershon | return '\r'; |
217 | 11:01dde4258840 | gershon | |
218 | 11:01dde4258840 | gershon | case 'b': |
219 | 11:01dde4258840 | gershon | return '\b'; |
220 | 11:01dde4258840 | gershon | |
221 | 11:01dde4258840 | gershon | case 'f': |
222 | 11:01dde4258840 | gershon | return '\f'; |
223 | 11:01dde4258840 | gershon | |
224 | 11:01dde4258840 | gershon | default: |
225 | 11:01dde4258840 | gershon | // Unreachable |
226 | 11:01dde4258840 | gershon | return '?'; |
227 | 11:01dde4258840 | gershon | } |
228 | 11:01dde4258840 | gershon | } |
229 | 11:01dde4258840 | gershon | |
230 | 11:01dde4258840 | gershon | private static bool State1 (FsmContext ctx) |
231 | 11:01dde4258840 | gershon | { |
232 | 11:01dde4258840 | gershon | while (ctx.L.GetChar ()) { |
233 | 11:01dde4258840 | gershon | if (ctx.L.input_char == ' ' || |
234 | 11:01dde4258840 | gershon | ctx.L.input_char >= '\t' && ctx.L.input_char <= '\r') |
235 | 11:01dde4258840 | gershon | continue; |
236 | 11:01dde4258840 | gershon | |
237 | 11:01dde4258840 | gershon | if (ctx.L.input_char >= '1' && ctx.L.input_char <= '9') { |
238 | 11:01dde4258840 | gershon | ctx.L.string_buffer.Append ((char) ctx.L.input_char); |
239 | 11:01dde4258840 | gershon | ctx.NextState = 3; |
240 | 11:01dde4258840 | gershon | return true; |
241 | 11:01dde4258840 | gershon | } |
242 | 11:01dde4258840 | gershon | |
243 | 11:01dde4258840 | gershon | switch (ctx.L.input_char) { |
244 | 11:01dde4258840 | gershon | case '"': |
245 | 11:01dde4258840 | gershon | ctx.NextState = 19; |
246 | 11:01dde4258840 | gershon | ctx.Return = true; |
247 | 11:01dde4258840 | gershon | return true; |
248 | 11:01dde4258840 | gershon | |
249 | 11:01dde4258840 | gershon | case ',': |
250 | 11:01dde4258840 | gershon | case ':': |
251 | 11:01dde4258840 | gershon | case '[': |
252 | 11:01dde4258840 | gershon | case ']': |
253 | 11:01dde4258840 | gershon | case '{': |
254 | 11:01dde4258840 | gershon | case '}': |
255 | 11:01dde4258840 | gershon | ctx.NextState = 1; |
256 | 11:01dde4258840 | gershon | ctx.Return = true; |
257 | 11:01dde4258840 | gershon | return true; |
258 | 11:01dde4258840 | gershon | |
259 | 11:01dde4258840 | gershon | case '-': |
260 | 11:01dde4258840 | gershon | ctx.L.string_buffer.Append ((char) ctx.L.input_char); |
261 | 11:01dde4258840 | gershon | ctx.NextState = 2; |
262 | 11:01dde4258840 | gershon | return true; |
263 | 11:01dde4258840 | gershon | |
264 | 11:01dde4258840 | gershon | case '0': |
265 | 11:01dde4258840 | gershon | ctx.L.string_buffer.Append ((char) ctx.L.input_char); |
266 | 11:01dde4258840 | gershon | ctx.NextState = 4; |
267 | 11:01dde4258840 | gershon | return true; |
268 | 11:01dde4258840 | gershon | |
269 | 11:01dde4258840 | gershon | case 'f': |
270 | 11:01dde4258840 | gershon | ctx.NextState = 12; |
271 | 11:01dde4258840 | gershon | return true; |
272 | 11:01dde4258840 | gershon | |
273 | 11:01dde4258840 | gershon | case 'n': |
274 | 11:01dde4258840 | gershon | ctx.NextState = 16; |
275 | 11:01dde4258840 | gershon | return true; |
276 | 11:01dde4258840 | gershon | |
277 | 11:01dde4258840 | gershon | case 't': |
278 | 11:01dde4258840 | gershon | ctx.NextState = 9; |
279 | 11:01dde4258840 | gershon | return true; |
280 | 11:01dde4258840 | gershon | |
281 | 11:01dde4258840 | gershon | case '\'': |
282 | 11:01dde4258840 | gershon | if (! ctx.L.allow_single_quoted_strings) |
283 | 11:01dde4258840 | gershon | return false; |
284 | 11:01dde4258840 | gershon | |
285 | 11:01dde4258840 | gershon | ctx.L.input_char = '"'; |
286 | 11:01dde4258840 | gershon | ctx.NextState = 23; |
287 | 11:01dde4258840 | gershon | ctx.Return = true; |
288 | 11:01dde4258840 | gershon | return true; |
289 | 11:01dde4258840 | gershon | |
290 | 11:01dde4258840 | gershon | case '/': |
291 | 11:01dde4258840 | gershon | if (! ctx.L.allow_comments) |
292 | 11:01dde4258840 | gershon | return false; |
293 | 11:01dde4258840 | gershon | |
294 | 11:01dde4258840 | gershon | ctx.NextState = 25; |
295 | 11:01dde4258840 | gershon | return true; |
296 | 11:01dde4258840 | gershon | |
297 | 11:01dde4258840 | gershon | default: |
298 | 11:01dde4258840 | gershon | return false; |
299 | 11:01dde4258840 | gershon | } |
300 | 11:01dde4258840 | gershon | } |
301 | 11:01dde4258840 | gershon | |
302 | 11:01dde4258840 | gershon | return true; |
303 | 11:01dde4258840 | gershon | } |
304 | 11:01dde4258840 | gershon | |
305 | 11:01dde4258840 | gershon | private static bool State2 (FsmContext ctx) |
306 | 11:01dde4258840 | gershon | { |
307 | 11:01dde4258840 | gershon | ctx.L.GetChar (); |
308 | 11:01dde4258840 | gershon | |
309 | 11:01dde4258840 | gershon | if (ctx.L.input_char >= '1' && ctx.L.input_char<= '9') { |
310 | 11:01dde4258840 | gershon | ctx.L.string_buffer.Append ((char) ctx.L.input_char); |
311 | 11:01dde4258840 | gershon | ctx.NextState = 3; |
312 | 11:01dde4258840 | gershon | return true; |
313 | 11:01dde4258840 | gershon | } |
314 | 11:01dde4258840 | gershon | |
315 | 11:01dde4258840 | gershon | switch (ctx.L.input_char) { |
316 | 11:01dde4258840 | gershon | case '0': |
317 | 11:01dde4258840 | gershon | ctx.L.string_buffer.Append ((char) ctx.L.input_char); |
318 | 11:01dde4258840 | gershon | ctx.NextState = 4; |
319 | 11:01dde4258840 | gershon | return true; |
320 | 11:01dde4258840 | gershon | |
321 | 11:01dde4258840 | gershon | default: |
322 | 11:01dde4258840 | gershon | return false; |
323 | 11:01dde4258840 | gershon | } |
324 | 11:01dde4258840 | gershon | } |
325 | 11:01dde4258840 | gershon | |
326 | 11:01dde4258840 | gershon | private static bool State3 (FsmContext ctx) |
327 | 11:01dde4258840 | gershon | { |
328 | 11:01dde4258840 | gershon | while (ctx.L.GetChar ()) { |
329 | 11:01dde4258840 | gershon | if (ctx.L.input_char >= '0' && ctx.L.input_char <= '9') { |
330 | 11:01dde4258840 | gershon | ctx.L.string_buffer.Append ((char) ctx.L.input_char); |
331 | 11:01dde4258840 | gershon | continue; |
332 | 11:01dde4258840 | gershon | } |
333 | 11:01dde4258840 | gershon | |
334 | 11:01dde4258840 | gershon | if (ctx.L.input_char == ' ' || |
335 | 11:01dde4258840 | gershon | ctx.L.input_char >= '\t' && ctx.L.input_char <= '\r') { |
336 | 11:01dde4258840 | gershon | ctx.Return = true; |
337 | 11:01dde4258840 | gershon | ctx.NextState = 1; |
338 | 11:01dde4258840 | gershon | return true; |
339 | 11:01dde4258840 | gershon | } |
340 | 11:01dde4258840 | gershon | |
341 | 11:01dde4258840 | gershon | switch (ctx.L.input_char) { |
342 | 11:01dde4258840 | gershon | case ',': |
343 | 11:01dde4258840 | gershon | case ']': |
344 | 11:01dde4258840 | gershon | case '}': |
345 | 11:01dde4258840 | gershon | ctx.L.UngetChar (); |
346 | 11:01dde4258840 | gershon | ctx.Return = true; |
347 | 11:01dde4258840 | gershon | ctx.NextState = 1; |
348 | 11:01dde4258840 | gershon | return true; |
349 | 11:01dde4258840 | gershon | |
350 | 11:01dde4258840 | gershon | case '.': |
351 | 11:01dde4258840 | gershon | ctx.L.string_buffer.Append ((char) ctx.L.input_char); |
352 | 11:01dde4258840 | gershon | ctx.NextState = 5; |
353 | 11:01dde4258840 | gershon | return true; |
354 | 11:01dde4258840 | gershon | |
355 | 11:01dde4258840 | gershon | case 'e': |
356 | 11:01dde4258840 | gershon | case 'E': |
357 | 11:01dde4258840 | gershon | ctx.L.string_buffer.Append ((char) ctx.L.input_char); |
358 | 11:01dde4258840 | gershon | ctx.NextState = 7; |
359 | 11:01dde4258840 | gershon | return true; |
360 | 11:01dde4258840 | gershon | |
361 | 11:01dde4258840 | gershon | default: |
362 | 11:01dde4258840 | gershon | return false; |
363 | 11:01dde4258840 | gershon | } |
364 | 11:01dde4258840 | gershon | } |
365 | 11:01dde4258840 | gershon | return true; |
366 | 11:01dde4258840 | gershon | } |
367 | 11:01dde4258840 | gershon | |
368 | 11:01dde4258840 | gershon | private static bool State4 (FsmContext ctx) |
369 | 11:01dde4258840 | gershon | { |
370 | 11:01dde4258840 | gershon | ctx.L.GetChar (); |
371 | 11:01dde4258840 | gershon | |
372 | 11:01dde4258840 | gershon | if (ctx.L.input_char == ' ' || |
373 | 11:01dde4258840 | gershon | ctx.L.input_char >= '\t' && ctx.L.input_char <= '\r') { |
374 | 11:01dde4258840 | gershon | ctx.Return = true; |
375 | 11:01dde4258840 | gershon | ctx.NextState = 1; |
376 | 11:01dde4258840 | gershon | return true; |
377 | 11:01dde4258840 | gershon | } |
378 | 11:01dde4258840 | gershon | |
379 | 11:01dde4258840 | gershon | switch (ctx.L.input_char) { |
380 | 11:01dde4258840 | gershon | case ',': |
381 | 11:01dde4258840 | gershon | case ']': |
382 | 11:01dde4258840 | gershon | case '}': |
383 | 11:01dde4258840 | gershon | ctx.L.UngetChar (); |
384 | 11:01dde4258840 | gershon | ctx.Return = true; |
385 | 11:01dde4258840 | gershon | ctx.NextState = 1; |
386 | 11:01dde4258840 | gershon | return true; |
387 | 11:01dde4258840 | gershon | |
388 | 11:01dde4258840 | gershon | case '.': |
389 | 11:01dde4258840 | gershon | ctx.L.string_buffer.Append ((char) ctx.L.input_char); |
390 | 11:01dde4258840 | gershon | ctx.NextState = 5; |
391 | 11:01dde4258840 | gershon | return true; |
392 | 11:01dde4258840 | gershon | |
393 | 11:01dde4258840 | gershon | case 'e': |
394 | 11:01dde4258840 | gershon | case 'E': |
395 | 11:01dde4258840 | gershon | ctx.L.string_buffer.Append ((char) ctx.L.input_char); |
396 | 11:01dde4258840 | gershon | ctx.NextState = 7; |
397 | 11:01dde4258840 | gershon | return true; |
398 | 11:01dde4258840 | gershon | |
399 | 11:01dde4258840 | gershon | default: |
400 | 11:01dde4258840 | gershon | return false; |
401 | 11:01dde4258840 | gershon | } |
402 | 11:01dde4258840 | gershon | } |
403 | 11:01dde4258840 | gershon | |
404 | 11:01dde4258840 | gershon | private static bool State5 (FsmContext ctx) |
405 | 11:01dde4258840 | gershon | { |
406 | 11:01dde4258840 | gershon | ctx.L.GetChar (); |
407 | 11:01dde4258840 | gershon | |
408 | 11:01dde4258840 | gershon | if (ctx.L.input_char >= '0' && ctx.L.input_char <= '9') { |
409 | 11:01dde4258840 | gershon | ctx.L.string_buffer.Append ((char) ctx.L.input_char); |
410 | 11:01dde4258840 | gershon | ctx.NextState = 6; |
411 | 11:01dde4258840 | gershon | return true; |
412 | 11:01dde4258840 | gershon | } |
413 | 11:01dde4258840 | gershon | |
414 | 11:01dde4258840 | gershon | return false; |
415 | 11:01dde4258840 | gershon | } |
416 | 11:01dde4258840 | gershon | |
417 | 11:01dde4258840 | gershon | private static bool State6 (FsmContext ctx) |
418 | 11:01dde4258840 | gershon | { |
419 | 11:01dde4258840 | gershon | while (ctx.L.GetChar ()) { |
420 | 11:01dde4258840 | gershon | if (ctx.L.input_char >= '0' && ctx.L.input_char <= '9') { |
421 | 11:01dde4258840 | gershon | ctx.L.string_buffer.Append ((char) ctx.L.input_char); |
422 | 11:01dde4258840 | gershon | continue; |
423 | 11:01dde4258840 | gershon | } |
424 | 11:01dde4258840 | gershon | |
425 | 11:01dde4258840 | gershon | if (ctx.L.input_char == ' ' || |
426 | 11:01dde4258840 | gershon | ctx.L.input_char >= '\t' && ctx.L.input_char <= '\r') { |
427 | 11:01dde4258840 | gershon | ctx.Return = true; |
428 | 11:01dde4258840 | gershon | ctx.NextState = 1; |
429 | 11:01dde4258840 | gershon | return true; |
430 | 11:01dde4258840 | gershon | } |
431 | 11:01dde4258840 | gershon | |
432 | 11:01dde4258840 | gershon | switch (ctx.L.input_char) { |
433 | 11:01dde4258840 | gershon | case ',': |
434 | 11:01dde4258840 | gershon | case ']': |
435 | 11:01dde4258840 | gershon | case '}': |
436 | 11:01dde4258840 | gershon | ctx.L.UngetChar (); |
437 | 11:01dde4258840 | gershon | ctx.Return = true; |
438 | 11:01dde4258840 | gershon | ctx.NextState = 1; |
439 | 11:01dde4258840 | gershon | return true; |
440 | 11:01dde4258840 | gershon | |
441 | 11:01dde4258840 | gershon | case 'e': |
442 | 11:01dde4258840 | gershon | case 'E': |
443 | 11:01dde4258840 | gershon | ctx.L.string_buffer.Append ((char) ctx.L.input_char); |
444 | 11:01dde4258840 | gershon | ctx.NextState = 7; |
445 | 11:01dde4258840 | gershon | return true; |
446 | 11:01dde4258840 | gershon | |
447 | 11:01dde4258840 | gershon | default: |
448 | 11:01dde4258840 | gershon | return false; |
449 | 11:01dde4258840 | gershon | } |
450 | 11:01dde4258840 | gershon | } |
451 | 11:01dde4258840 | gershon | |
452 | 11:01dde4258840 | gershon | return true; |
453 | 11:01dde4258840 | gershon | } |
454 | 11:01dde4258840 | gershon | |
455 | 11:01dde4258840 | gershon | private static bool State7 (FsmContext ctx) |
456 | 11:01dde4258840 | gershon | { |
457 | 11:01dde4258840 | gershon | ctx.L.GetChar (); |
458 | 11:01dde4258840 | gershon | |
459 | 11:01dde4258840 | gershon | if (ctx.L.input_char >= '0' && ctx.L.input_char<= '9') { |
460 | 11:01dde4258840 | gershon | ctx.L.string_buffer.Append ((char) ctx.L.input_char); |
461 | 11:01dde4258840 | gershon | ctx.NextState = 8; |
462 | 11:01dde4258840 | gershon | return true; |
463 | 11:01dde4258840 | gershon | } |
464 | 11:01dde4258840 | gershon | |
465 | 11:01dde4258840 | gershon | switch (ctx.L.input_char) { |
466 | 11:01dde4258840 | gershon | case '+': |
467 | 11:01dde4258840 | gershon | case '-': |
468 | 11:01dde4258840 | gershon | ctx.L.string_buffer.Append ((char) ctx.L.input_char); |
469 | 11:01dde4258840 | gershon | ctx.NextState = 8; |
470 | 11:01dde4258840 | gershon | return true; |
471 | 11:01dde4258840 | gershon | |
472 | 11:01dde4258840 | gershon | default: |
473 | 11:01dde4258840 | gershon | return false; |
474 | 11:01dde4258840 | gershon | } |
475 | 11:01dde4258840 | gershon | } |
476 | 11:01dde4258840 | gershon | |
477 | 11:01dde4258840 | gershon | private static bool State8 (FsmContext ctx) |
478 | 11:01dde4258840 | gershon | { |
479 | 11:01dde4258840 | gershon | while (ctx.L.GetChar ()) { |
480 | 11:01dde4258840 | gershon | if (ctx.L.input_char >= '0' && ctx.L.input_char<= '9') { |
481 | 11:01dde4258840 | gershon | ctx.L.string_buffer.Append ((char) ctx.L.input_char); |
482 | 11:01dde4258840 | gershon | continue; |
483 | 11:01dde4258840 | gershon | } |
484 | 11:01dde4258840 | gershon | |
485 | 11:01dde4258840 | gershon | if (ctx.L.input_char == ' ' || |
486 | 11:01dde4258840 | gershon | ctx.L.input_char >= '\t' && ctx.L.input_char<= '\r') { |
487 | 11:01dde4258840 | gershon | ctx.Return = true; |
488 | 11:01dde4258840 | gershon | ctx.NextState = 1; |
489 | 11:01dde4258840 | gershon | return true; |
490 | 11:01dde4258840 | gershon | } |
491 | 11:01dde4258840 | gershon | |
492 | 11:01dde4258840 | gershon | switch (ctx.L.input_char) { |
493 | 11:01dde4258840 | gershon | case ',': |
494 | 11:01dde4258840 | gershon | case ']': |
495 | 11:01dde4258840 | gershon | case '}': |
496 | 11:01dde4258840 | gershon | ctx.L.UngetChar (); |
497 | 11:01dde4258840 | gershon | ctx.Return = true; |
498 | 11:01dde4258840 | gershon | ctx.NextState = 1; |
499 | 11:01dde4258840 | gershon | return true; |
500 | 11:01dde4258840 | gershon | |
501 | 11:01dde4258840 | gershon | default: |
502 | 11:01dde4258840 | gershon | return false; |
503 | 11:01dde4258840 | gershon | } |
504 | 11:01dde4258840 | gershon | } |
505 | 11:01dde4258840 | gershon | |
506 | 11:01dde4258840 | gershon | return true; |
507 | 11:01dde4258840 | gershon | } |
508 | 11:01dde4258840 | gershon | |
509 | 11:01dde4258840 | gershon | private static bool State9 (FsmContext ctx) |
510 | 11:01dde4258840 | gershon | { |
511 | 11:01dde4258840 | gershon | ctx.L.GetChar (); |
512 | 11:01dde4258840 | gershon | |
513 | 11:01dde4258840 | gershon | switch (ctx.L.input_char) { |
514 | 11:01dde4258840 | gershon | case 'r': |
515 | 11:01dde4258840 | gershon | ctx.NextState = 10; |
516 | 11:01dde4258840 | gershon | return true; |
517 | 11:01dde4258840 | gershon | |
518 | 11:01dde4258840 | gershon | default: |
519 | 11:01dde4258840 | gershon | return false; |
520 | 11:01dde4258840 | gershon | } |
521 | 11:01dde4258840 | gershon | } |
522 | 11:01dde4258840 | gershon | |
523 | 11:01dde4258840 | gershon | private static bool State10 (FsmContext ctx) |
524 | 11:01dde4258840 | gershon | { |
525 | 11:01dde4258840 | gershon | ctx.L.GetChar (); |
526 | 11:01dde4258840 | gershon | |
527 | 11:01dde4258840 | gershon | switch (ctx.L.input_char) { |
528 | 11:01dde4258840 | gershon | case 'u': |
529 | 11:01dde4258840 | gershon | ctx.NextState = 11; |
530 | 11:01dde4258840 | gershon | return true; |
531 | 11:01dde4258840 | gershon | |
532 | 11:01dde4258840 | gershon | default: |
533 | 11:01dde4258840 | gershon | return false; |
534 | 11:01dde4258840 | gershon | } |
535 | 11:01dde4258840 | gershon | } |
536 | 11:01dde4258840 | gershon | |
537 | 11:01dde4258840 | gershon | private static bool State11 (FsmContext ctx) |
538 | 11:01dde4258840 | gershon | { |
539 | 11:01dde4258840 | gershon | ctx.L.GetChar (); |
540 | 11:01dde4258840 | gershon | |
541 | 11:01dde4258840 | gershon | switch (ctx.L.input_char) { |
542 | 11:01dde4258840 | gershon | case 'e': |
543 | 11:01dde4258840 | gershon | ctx.Return = true; |
544 | 11:01dde4258840 | gershon | ctx.NextState = 1; |
545 | 11:01dde4258840 | gershon | return true; |
546 | 11:01dde4258840 | gershon | |
547 | 11:01dde4258840 | gershon | default: |
548 | 11:01dde4258840 | gershon | return false; |
549 | 11:01dde4258840 | gershon | } |
550 | 11:01dde4258840 | gershon | } |
551 | 11:01dde4258840 | gershon | |
552 | 11:01dde4258840 | gershon | private static bool State12 (FsmContext ctx) |
553 | 11:01dde4258840 | gershon | { |
554 | 11:01dde4258840 | gershon | ctx.L.GetChar (); |
555 | 11:01dde4258840 | gershon | |
556 | 11:01dde4258840 | gershon | switch (ctx.L.input_char) { |
557 | 11:01dde4258840 | gershon | case 'a': |
558 | 11:01dde4258840 | gershon | ctx.NextState = 13; |
559 | 11:01dde4258840 | gershon | return true; |
560 | 11:01dde4258840 | gershon | |
561 | 11:01dde4258840 | gershon | default: |
562 | 11:01dde4258840 | gershon | return false; |
563 | 11:01dde4258840 | gershon | } |
564 | 11:01dde4258840 | gershon | } |
565 | 11:01dde4258840 | gershon | |
566 | 11:01dde4258840 | gershon | private static bool State13 (FsmContext ctx) |
567 | 11:01dde4258840 | gershon | { |
568 | 11:01dde4258840 | gershon | ctx.L.GetChar (); |
569 | 11:01dde4258840 | gershon | |
570 | 11:01dde4258840 | gershon | switch (ctx.L.input_char) { |
571 | 11:01dde4258840 | gershon | case 'l': |
572 | 11:01dde4258840 | gershon | ctx.NextState = 14; |
573 | 11:01dde4258840 | gershon | return true; |
574 | 11:01dde4258840 | gershon | |
575 | 11:01dde4258840 | gershon | default: |
576 | 11:01dde4258840 | gershon | return false; |
577 | 11:01dde4258840 | gershon | } |
578 | 11:01dde4258840 | gershon | } |
579 | 11:01dde4258840 | gershon | |
580 | 11:01dde4258840 | gershon | private static bool State14 (FsmContext ctx) |
581 | 11:01dde4258840 | gershon | { |
582 | 11:01dde4258840 | gershon | ctx.L.GetChar (); |
583 | 11:01dde4258840 | gershon | |
584 | 11:01dde4258840 | gershon | switch (ctx.L.input_char) { |
585 | 11:01dde4258840 | gershon | case 's': |
586 | 11:01dde4258840 | gershon | ctx.NextState = 15; |
587 | 11:01dde4258840 | gershon | return true; |
588 | 11:01dde4258840 | gershon | |
589 | 11:01dde4258840 | gershon | default: |
590 | 11:01dde4258840 | gershon | return false; |
591 | 11:01dde4258840 | gershon | } |
592 | 11:01dde4258840 | gershon | } |
593 | 11:01dde4258840 | gershon | |
594 | 11:01dde4258840 | gershon | private static bool State15 (FsmContext ctx) |
595 | 11:01dde4258840 | gershon | { |
596 | 11:01dde4258840 | gershon | ctx.L.GetChar (); |
597 | 11:01dde4258840 | gershon | |
598 | 11:01dde4258840 | gershon | switch (ctx.L.input_char) { |
599 | 11:01dde4258840 | gershon | case 'e': |
600 | 11:01dde4258840 | gershon | ctx.Return = true; |
601 | 11:01dde4258840 | gershon | ctx.NextState = 1; |
602 | 11:01dde4258840 | gershon | return true; |
603 | 11:01dde4258840 | gershon | |
604 | 11:01dde4258840 | gershon | default: |
605 | 11:01dde4258840 | gershon | return false; |
606 | 11:01dde4258840 | gershon | } |
607 | 11:01dde4258840 | gershon | } |
608 | 11:01dde4258840 | gershon | |
609 | 11:01dde4258840 | gershon | private static bool State16 (FsmContext ctx) |
610 | 11:01dde4258840 | gershon | { |
611 | 11:01dde4258840 | gershon | ctx.L.GetChar (); |
612 | 11:01dde4258840 | gershon | |
613 | 11:01dde4258840 | gershon | switch (ctx.L.input_char) { |
614 | 11:01dde4258840 | gershon | case 'u': |
615 | 11:01dde4258840 | gershon | ctx.NextState = 17; |
616 | 11:01dde4258840 | gershon | return true; |
617 | 11:01dde4258840 | gershon | |
618 | 11:01dde4258840 | gershon | default: |
619 | 11:01dde4258840 | gershon | return false; |
620 | 11:01dde4258840 | gershon | } |
621 | 11:01dde4258840 | gershon | } |
622 | 11:01dde4258840 | gershon | |
623 | 11:01dde4258840 | gershon | private static bool State17 (FsmContext ctx) |
624 | 11:01dde4258840 | gershon | { |
625 | 11:01dde4258840 | gershon | ctx.L.GetChar (); |
626 | 11:01dde4258840 | gershon | |
627 | 11:01dde4258840 | gershon | switch (ctx.L.input_char) { |
628 | 11:01dde4258840 | gershon | case 'l': |
629 | 11:01dde4258840 | gershon | ctx.NextState = 18; |
630 | 11:01dde4258840 | gershon | return true; |
631 | 11:01dde4258840 | gershon | |
632 | 11:01dde4258840 | gershon | default: |
633 | 11:01dde4258840 | gershon | return false; |
634 | 11:01dde4258840 | gershon | } |
635 | 11:01dde4258840 | gershon | } |
636 | 11:01dde4258840 | gershon | |
637 | 11:01dde4258840 | gershon | private static bool State18 (FsmContext ctx) |
638 | 11:01dde4258840 | gershon | { |
639 | 11:01dde4258840 | gershon | ctx.L.GetChar (); |
640 | 11:01dde4258840 | gershon | |
641 | 11:01dde4258840 | gershon | switch (ctx.L.input_char) { |
642 | 11:01dde4258840 | gershon | case 'l': |
643 | 11:01dde4258840 | gershon | ctx.Return = true; |
644 | 11:01dde4258840 | gershon | ctx.NextState = 1; |
645 | 11:01dde4258840 | gershon | return true; |
646 | 11:01dde4258840 | gershon | |
647 | 11:01dde4258840 | gershon | default: |
648 | 11:01dde4258840 | gershon | return false; |
649 | 11:01dde4258840 | gershon | } |
650 | 11:01dde4258840 | gershon | } |
651 | 11:01dde4258840 | gershon | |
652 | 11:01dde4258840 | gershon | private static bool State19 (FsmContext ctx) |
653 | 11:01dde4258840 | gershon | { |
654 | 11:01dde4258840 | gershon | while (ctx.L.GetChar ()) { |
655 | 11:01dde4258840 | gershon | switch (ctx.L.input_char) { |
656 | 11:01dde4258840 | gershon | case '"': |
657 | 11:01dde4258840 | gershon | ctx.L.UngetChar (); |
658 | 11:01dde4258840 | gershon | ctx.Return = true; |
659 | 11:01dde4258840 | gershon | ctx.NextState = 20; |
660 | 11:01dde4258840 | gershon | return true; |
661 | 11:01dde4258840 | gershon | |
662 | 11:01dde4258840 | gershon | case '\\': |
663 | 11:01dde4258840 | gershon | ctx.StateStack = 19; |
664 | 11:01dde4258840 | gershon | ctx.NextState = 21; |
665 | 11:01dde4258840 | gershon | return true; |
666 | 11:01dde4258840 | gershon | |
667 | 11:01dde4258840 | gershon | default: |
668 | 11:01dde4258840 | gershon | ctx.L.string_buffer.Append ((char) ctx.L.input_char); |
669 | 11:01dde4258840 | gershon | continue; |
670 | 11:01dde4258840 | gershon | } |
671 | 11:01dde4258840 | gershon | } |
672 | 11:01dde4258840 | gershon | |
673 | 11:01dde4258840 | gershon | return true; |
674 | 11:01dde4258840 | gershon | } |
675 | 11:01dde4258840 | gershon | |
676 | 11:01dde4258840 | gershon | private static bool State20 (FsmContext ctx) |
677 | 11:01dde4258840 | gershon | { |
678 | 11:01dde4258840 | gershon | ctx.L.GetChar (); |
679 | 11:01dde4258840 | gershon | |
680 | 11:01dde4258840 | gershon | switch (ctx.L.input_char) { |
681 | 11:01dde4258840 | gershon | case '"': |
682 | 11:01dde4258840 | gershon | ctx.Return = true; |
683 | 11:01dde4258840 | gershon | ctx.NextState = 1; |
684 | 11:01dde4258840 | gershon | return true; |
685 | 11:01dde4258840 | gershon | |
686 | 11:01dde4258840 | gershon | default: |
687 | 11:01dde4258840 | gershon | return false; |
688 | 11:01dde4258840 | gershon | } |
689 | 11:01dde4258840 | gershon | } |
690 | 11:01dde4258840 | gershon | |
691 | 11:01dde4258840 | gershon | private static bool State21 (FsmContext ctx) |
692 | 11:01dde4258840 | gershon | { |
693 | 11:01dde4258840 | gershon | ctx.L.GetChar (); |
694 | 11:01dde4258840 | gershon | |
695 | 11:01dde4258840 | gershon | switch (ctx.L.input_char) { |
696 | 11:01dde4258840 | gershon | case 'u': |
697 | 11:01dde4258840 | gershon | ctx.NextState = 22; |
698 | 11:01dde4258840 | gershon | return true; |
699 | 11:01dde4258840 | gershon | |
700 | 11:01dde4258840 | gershon | case '"': |
701 | 11:01dde4258840 | gershon | case '\'': |
702 | 11:01dde4258840 | gershon | case '/': |
703 | 11:01dde4258840 | gershon | case '\\': |
704 | 11:01dde4258840 | gershon | case 'b': |
705 | 11:01dde4258840 | gershon | case 'f': |
706 | 11:01dde4258840 | gershon | case 'n': |
707 | 11:01dde4258840 | gershon | case 'r': |
708 | 11:01dde4258840 | gershon | case 't': |
709 | 11:01dde4258840 | gershon | ctx.L.string_buffer.Append ( |
710 | 11:01dde4258840 | gershon | ProcessEscChar (ctx.L.input_char)); |
711 | 11:01dde4258840 | gershon | ctx.NextState = ctx.StateStack; |
712 | 11:01dde4258840 | gershon | return true; |
713 | 11:01dde4258840 | gershon | |
714 | 11:01dde4258840 | gershon | default: |
715 | 11:01dde4258840 | gershon | return false; |
716 | 11:01dde4258840 | gershon | } |
717 | 11:01dde4258840 | gershon | } |
718 | 11:01dde4258840 | gershon | |
719 | 11:01dde4258840 | gershon | private static bool State22 (FsmContext ctx) |
720 | 11:01dde4258840 | gershon | { |
721 | 11:01dde4258840 | gershon | int counter = 0; |
722 | 11:01dde4258840 | gershon | int mult = 4096; |
723 | 11:01dde4258840 | gershon | |
724 | 11:01dde4258840 | gershon | ctx.L.unichar = 0; |
725 | 11:01dde4258840 | gershon | |
726 | 11:01dde4258840 | gershon | while (ctx.L.GetChar ()) { |
727 | 11:01dde4258840 | gershon | |
728 | 11:01dde4258840 | gershon | if (ctx.L.input_char >= '0' && ctx.L.input_char <= '9' || |
729 | 11:01dde4258840 | gershon | ctx.L.input_char >= 'A' && ctx.L.input_char <= 'F' || |
730 | 11:01dde4258840 | gershon | ctx.L.input_char >= 'a' && ctx.L.input_char <= 'f') { |
731 | 11:01dde4258840 | gershon | |
732 | 11:01dde4258840 | gershon | ctx.L.unichar += HexValue (ctx.L.input_char) * mult; |
733 | 11:01dde4258840 | gershon | |
734 | 11:01dde4258840 | gershon | counter++; |
735 | 11:01dde4258840 | gershon | mult /= 16; |
736 | 11:01dde4258840 | gershon | |
737 | 11:01dde4258840 | gershon | if (counter == 4) { |
738 | 11:01dde4258840 | gershon | ctx.L.string_buffer.Append ( |
739 | 11:01dde4258840 | gershon | Convert.ToChar (ctx.L.unichar)); |
740 | 11:01dde4258840 | gershon | ctx.NextState = ctx.StateStack; |
741 | 11:01dde4258840 | gershon | return true; |
742 | 11:01dde4258840 | gershon | } |
743 | 11:01dde4258840 | gershon | |
744 | 11:01dde4258840 | gershon | continue; |
745 | 11:01dde4258840 | gershon | } |
746 | 11:01dde4258840 | gershon | |
747 | 11:01dde4258840 | gershon | return false; |
748 | 11:01dde4258840 | gershon | } |
749 | 11:01dde4258840 | gershon | |
750 | 11:01dde4258840 | gershon | return true; |
751 | 11:01dde4258840 | gershon | } |
752 | 11:01dde4258840 | gershon | |
753 | 11:01dde4258840 | gershon | private static bool State23 (FsmContext ctx) |
754 | 11:01dde4258840 | gershon | { |
755 | 11:01dde4258840 | gershon | while (ctx.L.GetChar ()) { |
756 | 11:01dde4258840 | gershon | switch (ctx.L.input_char) { |
757 | 11:01dde4258840 | gershon | case '\'': |
758 | 11:01dde4258840 | gershon | ctx.L.UngetChar (); |
759 | 11:01dde4258840 | gershon | ctx.Return = true; |
760 | 11:01dde4258840 | gershon | ctx.NextState = 24; |
761 | 11:01dde4258840 | gershon | return true; |
762 | 11:01dde4258840 | gershon | |
763 | 11:01dde4258840 | gershon | case '\\': |
764 | 11:01dde4258840 | gershon | ctx.StateStack = 23; |
765 | 11:01dde4258840 | gershon | ctx.NextState = 21; |
766 | 11:01dde4258840 | gershon | return true; |
767 | 11:01dde4258840 | gershon | |
768 | 11:01dde4258840 | gershon | default: |
769 | 11:01dde4258840 | gershon | ctx.L.string_buffer.Append ((char) ctx.L.input_char); |
770 | 11:01dde4258840 | gershon | continue; |
771 | 11:01dde4258840 | gershon | } |
772 | 11:01dde4258840 | gershon | } |
773 | 11:01dde4258840 | gershon | |
774 | 11:01dde4258840 | gershon | return true; |
775 | 11:01dde4258840 | gershon | } |
776 | 11:01dde4258840 | gershon | |
777 | 11:01dde4258840 | gershon | private static bool State24 (FsmContext ctx) |
778 | 11:01dde4258840 | gershon | { |
779 | 11:01dde4258840 | gershon | ctx.L.GetChar (); |
780 | 11:01dde4258840 | gershon | |
781 | 11:01dde4258840 | gershon | switch (ctx.L.input_char) { |
782 | 11:01dde4258840 | gershon | case '\'': |
783 | 11:01dde4258840 | gershon | ctx.L.input_char = '"'; |
784 | 11:01dde4258840 | gershon | ctx.Return = true; |
785 | 11:01dde4258840 | gershon | ctx.NextState = 1; |
786 | 11:01dde4258840 | gershon | return true; |
787 | 11:01dde4258840 | gershon | |
788 | 11:01dde4258840 | gershon | default: |
789 | 11:01dde4258840 | gershon | return false; |
790 | 11:01dde4258840 | gershon | } |
791 | 11:01dde4258840 | gershon | } |
792 | 11:01dde4258840 | gershon | |
793 | 11:01dde4258840 | gershon | private static bool State25 (FsmContext ctx) |
794 | 11:01dde4258840 | gershon | { |
795 | 11:01dde4258840 | gershon | ctx.L.GetChar (); |
796 | 11:01dde4258840 | gershon | |
797 | 11:01dde4258840 | gershon | switch (ctx.L.input_char) { |
798 | 11:01dde4258840 | gershon | case '*': |
799 | 11:01dde4258840 | gershon | ctx.NextState = 27; |
800 | 11:01dde4258840 | gershon | return true; |
801 | 11:01dde4258840 | gershon | |
802 | 11:01dde4258840 | gershon | case '/': |
803 | 11:01dde4258840 | gershon | ctx.NextState = 26; |
804 | 11:01dde4258840 | gershon | return true; |
805 | 11:01dde4258840 | gershon | |
806 | 11:01dde4258840 | gershon | default: |
807 | 11:01dde4258840 | gershon | return false; |
808 | 11:01dde4258840 | gershon | } |
809 | 11:01dde4258840 | gershon | } |
810 | 11:01dde4258840 | gershon | |
811 | 11:01dde4258840 | gershon | private static bool State26 (FsmContext ctx) |
812 | 11:01dde4258840 | gershon | { |
813 | 11:01dde4258840 | gershon | while (ctx.L.GetChar ()) { |
814 | 11:01dde4258840 | gershon | if (ctx.L.input_char == '\n') { |
815 | 11:01dde4258840 | gershon | ctx.NextState = 1; |
816 | 11:01dde4258840 | gershon | return true; |
817 | 11:01dde4258840 | gershon | } |
818 | 11:01dde4258840 | gershon | } |
819 | 11:01dde4258840 | gershon | |
820 | 11:01dde4258840 | gershon | return true; |
821 | 11:01dde4258840 | gershon | } |
822 | 11:01dde4258840 | gershon | |
823 | 11:01dde4258840 | gershon | private static bool State27 (FsmContext ctx) |
824 | 11:01dde4258840 | gershon | { |
825 | 11:01dde4258840 | gershon | while (ctx.L.GetChar ()) { |
826 | 11:01dde4258840 | gershon | if (ctx.L.input_char == '*') { |
827 | 11:01dde4258840 | gershon | ctx.NextState = 28; |
828 | 11:01dde4258840 | gershon | return true; |
829 | 11:01dde4258840 | gershon | } |
830 | 11:01dde4258840 | gershon | } |
831 | 11:01dde4258840 | gershon | |
832 | 11:01dde4258840 | gershon | return true; |
833 | 11:01dde4258840 | gershon | } |
834 | 11:01dde4258840 | gershon | |
835 | 11:01dde4258840 | gershon | private static bool State28 (FsmContext ctx) |
836 | 11:01dde4258840 | gershon | { |
837 | 11:01dde4258840 | gershon | while (ctx.L.GetChar ()) { |
838 | 11:01dde4258840 | gershon | if (ctx.L.input_char == '*') |
839 | 11:01dde4258840 | gershon | continue; |
840 | 11:01dde4258840 | gershon | |
841 | 11:01dde4258840 | gershon | if (ctx.L.input_char == '/') { |
842 | 11:01dde4258840 | gershon | ctx.NextState = 1; |
843 | 11:01dde4258840 | gershon | return true; |
844 | 11:01dde4258840 | gershon | } |
845 | 11:01dde4258840 | gershon | |
846 | 11:01dde4258840 | gershon | ctx.NextState = 27; |
847 | 11:01dde4258840 | gershon | return true; |
848 | 11:01dde4258840 | gershon | } |
849 | 11:01dde4258840 | gershon | |
850 | 11:01dde4258840 | gershon | return true; |
851 | 11:01dde4258840 | gershon | } |
852 | 11:01dde4258840 | gershon | #endregion |
853 | 11:01dde4258840 | gershon | |
854 | 11:01dde4258840 | gershon | |
855 | 11:01dde4258840 | gershon | private bool GetChar () |
856 | 11:01dde4258840 | gershon | { |
857 | 11:01dde4258840 | gershon | if ((input_char = NextChar ()) != -1) |
858 | 11:01dde4258840 | gershon | return true; |
859 | 11:01dde4258840 | gershon | |
860 | 11:01dde4258840 | gershon | end_of_input = true; |
861 | 11:01dde4258840 | gershon | return false; |
862 | 11:01dde4258840 | gershon | } |
863 | 11:01dde4258840 | gershon | |
864 | 11:01dde4258840 | gershon | private int NextChar () |
865 | 11:01dde4258840 | gershon | { |
866 | 11:01dde4258840 | gershon | if (input_buffer != 0) { |
867 | 11:01dde4258840 | gershon | int tmp = input_buffer; |
868 | 11:01dde4258840 | gershon | input_buffer = 0; |
869 | 11:01dde4258840 | gershon | |
870 | 11:01dde4258840 | gershon | return tmp; |
871 | 11:01dde4258840 | gershon | } |
872 | 11:01dde4258840 | gershon | |
873 | 11:01dde4258840 | gershon | return reader.Read (); |
874 | 11:01dde4258840 | gershon | } |
875 | 11:01dde4258840 | gershon | |
876 | 11:01dde4258840 | gershon | public bool NextToken () |
877 | 11:01dde4258840 | gershon | { |
878 | 11:01dde4258840 | gershon | StateHandler handler; |
879 | 11:01dde4258840 | gershon | fsm_context.Return = false; |
880 | 11:01dde4258840 | gershon | |
881 | 11:01dde4258840 | gershon | while (true) { |
882 | 11:01dde4258840 | gershon | handler = fsm_handler_table[state - 1]; |
883 | 11:01dde4258840 | gershon | |
884 | 11:01dde4258840 | gershon | if (! handler (fsm_context)) |
885 | 11:01dde4258840 | gershon | throw new JsonException (input_char); |
886 | 11:01dde4258840 | gershon | |
887 | 11:01dde4258840 | gershon | if (end_of_input) |
888 | 11:01dde4258840 | gershon | return false; |
889 | 11:01dde4258840 | gershon | |
890 | 11:01dde4258840 | gershon | if (fsm_context.Return) { |
891 | 11:01dde4258840 | gershon | string_value = string_buffer.ToString (); |
892 | 11:01dde4258840 | gershon | string_buffer.Remove (0, string_buffer.Length); |
893 | 11:01dde4258840 | gershon | token = fsm_return_table[state - 1]; |
894 | 11:01dde4258840 | gershon | |
895 | 11:01dde4258840 | gershon | if (token == (int) ParserToken.Char) |
896 | 11:01dde4258840 | gershon | token = input_char; |
897 | 11:01dde4258840 | gershon | |
898 | 11:01dde4258840 | gershon | state = fsm_context.NextState; |
899 | 11:01dde4258840 | gershon | |
900 | 11:01dde4258840 | gershon | return true; |
901 | 11:01dde4258840 | gershon | } |
902 | 11:01dde4258840 | gershon | |
903 | 11:01dde4258840 | gershon | state = fsm_context.NextState; |
904 | 11:01dde4258840 | gershon | } |
905 | 11:01dde4258840 | gershon | } |
906 | 11:01dde4258840 | gershon | |
907 | 11:01dde4258840 | gershon | private void UngetChar () |
908 | 11:01dde4258840 | gershon | { |
909 | 11:01dde4258840 | gershon | input_buffer = input_char; |
910 | 11:01dde4258840 | gershon | } |
911 | 11:01dde4258840 | gershon | } |
912 | 11:01dde4258840 | gershon | } |