1# pylint: disable=line-too-long
2
3import sys
4
5
6if sys.version_info[0] < 3:
7    # pylint: disable=redefined-builtin
8    chr = unichr
9    range = xrange
10    str = unicode
11
12
13class Parser(object):
14    def __init__(self, msg, fname):
15        self.msg = str(msg)
16        self.end = len(self.msg)
17        self.fname = fname
18        self.val = None
19        self.pos = 0
20        self.failed = False
21        self.errpos = 0
22        self._scopes = []
23        self._cache = {}
24
25    def parse(self):
26        self._grammar_()
27        if self.failed:
28            return None, self._err_str(), self.errpos
29        return self.val, None, self.pos
30
31    def _err_str(self):
32        lineno, colno = self._err_offsets()
33        if self.errpos == len(self.msg):
34            thing = 'end of input'
35        else:
36            thing = '"%s"' % self.msg[self.errpos]
37        return '%s:%d Unexpected %s at column %d' % (
38            self.fname, lineno, thing, colno)
39
40    def _err_offsets(self):
41        lineno = 1
42        colno = 1
43        for i in range(self.errpos):
44            if self.msg[i] == '\n':
45                lineno += 1
46                colno = 1
47            else:
48                colno += 1
49        return lineno, colno
50
51    def _succeed(self, v, newpos=None):
52        self.val = v
53        self.failed = False
54        if newpos is not None:
55            self.pos = newpos
56
57    def _fail(self):
58        self.val = None
59        self.failed = True
60        if self.pos >= self.errpos:
61            self.errpos = self.pos
62
63    def _rewind(self, newpos):
64        self._succeed(None, newpos)
65
66    def _bind(self, rule, var):
67        rule()
68        if not self.failed:
69            self._set(var, self.val)
70
71    def _not(self, rule):
72        p = self.pos
73        rule()
74        if self.failed:
75            self._succeed(None, p)
76        else:
77            self._rewind(p)
78            self._fail()
79
80    def _opt(self, rule):
81        p = self.pos
82        rule()
83        if self.failed:
84            self._succeed([], p)
85        else:
86            self._succeed([self.val])
87
88    def _plus(self, rule):
89        vs = []
90        rule()
91        vs.append(self.val)
92        if self.failed:
93            return
94        self._star(rule, vs)
95
96    def _star(self, rule, vs=None):
97        vs = vs or []
98        while not self.failed:
99            p = self.pos
100            rule()
101            if self.failed:
102                self._rewind(p)
103                break
104            else:
105                vs.append(self.val)
106        self._succeed(vs)
107
108    def _seq(self, rules):
109        for rule in rules:
110            rule()
111            if self.failed:
112                return
113
114    def _choose(self, rules):
115        p = self.pos
116        for rule in rules[:-1]:
117            rule()
118            if not self.failed:
119                return
120            self._rewind(p)
121        rules[-1]()
122
123    def _ch(self, ch):
124        p = self.pos
125        if p < self.end and self.msg[p] == ch:
126            self._succeed(ch, self.pos + 1)
127        else:
128            self._fail()
129
130    def _str(self, s, l):
131        p = self.pos
132        if (p + l <= self.end) and self.msg[p:p + l] == s:
133            self._succeed(s, self.pos + l)
134        else:
135            self._fail()
136
137    def _range(self, i, j):
138        p = self.pos
139        if p != self.end and ord(i) <= ord(self.msg[p]) <= ord(j):
140            self._succeed(self.msg[p], self.pos + 1)
141        else:
142            self._fail()
143
144    def _push(self, name):
145        self._scopes.append((name, {}))
146
147    def _pop(self, name):
148        actual_name, _ = self._scopes.pop()
149        assert name == actual_name
150
151    def _get(self, var):
152        return self._scopes[-1][1][var]
153
154    def _set(self, var, val):
155        self._scopes[-1][1][var] = val
156
157    def _is_unicat(self, var, cat):
158        import unicodedata
159        return unicodedata.category(var) == cat
160
161    def _join(self, s, vs):
162        return s.join(vs)
163
164    def _xtou(self, s):
165        return chr(int(s, base=16))
166
167    def _grammar_(self):
168        self._push('grammar')
169        self._seq([self._sp_, lambda: self._bind(self._value_, 'v'), self._sp_,
170                   self._end_, lambda: self._succeed(self._get('v'))])
171        self._pop('grammar')
172
173    def _sp_(self):
174        self._star(self._ws_)
175
176    def _ws_(self):
177        self._choose([self._ws__c0_, self._eol_, self._comment_, self._ws__c3_,
178                      self._ws__c4_, self._ws__c5_, self._ws__c6_,
179                      self._ws__c7_, self._ws__c8_])
180
181    def _ws__c0_(self):
182        self._ch(' ')
183
184    def _ws__c3_(self):
185        self._ch('\t')
186
187    def _ws__c4_(self):
188        self._ch('\v')
189
190    def _ws__c5_(self):
191        self._ch('\f')
192
193    def _ws__c6_(self):
194        self._ch('\u00a0')
195
196    def _ws__c7_(self):
197        self._ch(u'\ufeff')
198
199    def _ws__c8_(self):
200        self._push('ws__c8')
201        self._seq([lambda: self._bind(self._anything_, 'x'), self._ws__c8__s1_,
202                   lambda: self._succeed(self._get('x'))])
203        self._pop('ws__c8')
204
205    def _ws__c8__s1_(self):
206        v = self._is_unicat(self._get('x'), 'Zs')
207        if v:
208            self._succeed(v)
209        else:
210            self._fail()
211
212    def _eol_(self):
213        self._choose([self._eol__c0_, self._eol__c1_, self._eol__c2_,
214                      self._eol__c3_, self._eol__c4_])
215
216    def _eol__c0_(self):
217        self._seq([lambda: self._ch('\r'), lambda: self._ch('\n')])
218
219    def _eol__c1_(self):
220        self._ch('\r')
221
222    def _eol__c2_(self):
223        self._ch('\n')
224
225    def _eol__c3_(self):
226        self._ch(u'\u2028')
227
228    def _eol__c4_(self):
229        self._ch(u'\u2029')
230
231    def _comment_(self):
232        self._choose([self._comment__c0_, self._comment__c1_])
233
234    def _comment__c0_(self):
235        self._seq([lambda: self._str('//', 2),
236                   lambda: self._star(self._comment__c0__s1_p_)])
237
238    def _comment__c0__s1_p_(self):
239        self._seq([lambda: self._not(self._eol_), self._anything_])
240
241    def _comment__c1_(self):
242        self._seq([lambda: self._str('/*', 2), self._comment__c1__s1_,
243                   lambda: self._str('*/', 2)])
244
245    def _comment__c1__s1_(self):
246        self._star(lambda: self._seq([self._comment__c1__s1_p__s0_, self._anything_]))
247
248    def _comment__c1__s1_p__s0_(self):
249        self._not(lambda: self._str('*/', 2))
250
251    def _value_(self):
252        self._choose([self._value__c0_, self._value__c1_, self._value__c2_,
253                      self._value__c3_, self._value__c4_, self._value__c5_,
254                      self._value__c6_])
255
256    def _value__c0_(self):
257        self._seq([lambda: self._str('null', 4), lambda: self._succeed('None')])
258
259    def _value__c1_(self):
260        self._seq([lambda: self._str('true', 4), lambda: self._succeed('True')])
261
262    def _value__c2_(self):
263        self._seq([lambda: self._str('false', 5),
264                   lambda: self._succeed('False')])
265
266    def _value__c3_(self):
267        self._push('value__c3')
268        self._seq([lambda: self._bind(self._object_, 'v'),
269                   lambda: self._succeed(['object', self._get('v')])])
270        self._pop('value__c3')
271
272    def _value__c4_(self):
273        self._push('value__c4')
274        self._seq([lambda: self._bind(self._array_, 'v'),
275                   lambda: self._succeed(['array', self._get('v')])])
276        self._pop('value__c4')
277
278    def _value__c5_(self):
279        self._push('value__c5')
280        self._seq([lambda: self._bind(self._string_, 'v'),
281                   lambda: self._succeed(['string', self._get('v')])])
282        self._pop('value__c5')
283
284    def _value__c6_(self):
285        self._push('value__c6')
286        self._seq([lambda: self._bind(self._num_literal_, 'v'),
287                   lambda: self._succeed(['number', self._get('v')])])
288        self._pop('value__c6')
289
290    def _object_(self):
291        self._choose([self._object__c0_, self._object__c1_])
292
293    def _object__c0_(self):
294        self._push('object__c0')
295        self._seq([lambda: self._ch('{'), self._sp_,
296                   lambda: self._bind(self._member_list_, 'v'), self._sp_,
297                   lambda: self._ch('}'), lambda: self._succeed(self._get('v'))])
298        self._pop('object__c0')
299
300    def _object__c1_(self):
301        self._seq([lambda: self._ch('{'), self._sp_, lambda: self._ch('}'),
302                   lambda: self._succeed([])])
303
304    def _array_(self):
305        self._choose([self._array__c0_, self._array__c1_])
306
307    def _array__c0_(self):
308        self._push('array__c0')
309        self._seq([lambda: self._ch('['), self._sp_,
310                   lambda: self._bind(self._element_list_, 'v'), self._sp_,
311                   lambda: self._ch(']'), lambda: self._succeed(self._get('v'))])
312        self._pop('array__c0')
313
314    def _array__c1_(self):
315        self._seq([lambda: self._ch('['), self._sp_, lambda: self._ch(']'),
316                   lambda: self._succeed([])])
317
318    def _string_(self):
319        self._choose([self._string__c0_, self._string__c1_])
320
321    def _string__c0_(self):
322        self._push('string__c0')
323        self._seq([self._squote_, self._string__c0__s1_, self._squote_,
324                   lambda: self._succeed(self._join('', self._get('cs')))])
325        self._pop('string__c0')
326
327    def _string__c0__s1_(self):
328        self._bind(lambda: self._star(self._sqchar_), 'cs')
329
330    def _string__c1_(self):
331        self._push('string__c1')
332        self._seq([self._dquote_, self._string__c1__s1_, self._dquote_,
333                   lambda: self._succeed(self._join('', self._get('cs')))])
334        self._pop('string__c1')
335
336    def _string__c1__s1_(self):
337        self._bind(lambda: self._star(self._dqchar_), 'cs')
338
339    def _sqchar_(self):
340        self._choose([self._sqchar__c0_, self._sqchar__c1_, self._sqchar__c2_])
341
342    def _sqchar__c0_(self):
343        self._push('sqchar__c0')
344        self._seq([self._bslash_, lambda: self._bind(self._esc_char_, 'c'),
345                   lambda: self._succeed(self._get('c'))])
346        self._pop('sqchar__c0')
347
348    def _sqchar__c1_(self):
349        self._seq([self._bslash_, self._eol_, lambda: self._succeed('')])
350
351    def _sqchar__c2_(self):
352        self._push('sqchar__c2')
353        self._seq([lambda: self._not(self._bslash_),
354                   lambda: self._not(self._squote_),
355                   lambda: self._not(self._eol_),
356                   lambda: self._bind(self._anything_, 'c'),
357                   lambda: self._succeed(self._get('c'))])
358        self._pop('sqchar__c2')
359
360    def _dqchar_(self):
361        self._choose([self._dqchar__c0_, self._dqchar__c1_, self._dqchar__c2_])
362
363    def _dqchar__c0_(self):
364        self._push('dqchar__c0')
365        self._seq([self._bslash_, lambda: self._bind(self._esc_char_, 'c'),
366                   lambda: self._succeed(self._get('c'))])
367        self._pop('dqchar__c0')
368
369    def _dqchar__c1_(self):
370        self._seq([self._bslash_, self._eol_, lambda: self._succeed('')])
371
372    def _dqchar__c2_(self):
373        self._push('dqchar__c2')
374        self._seq([lambda: self._not(self._bslash_),
375                   lambda: self._not(self._dquote_),
376                   lambda: self._not(self._eol_),
377                   lambda: self._bind(self._anything_, 'c'),
378                   lambda: self._succeed(self._get('c'))])
379        self._pop('dqchar__c2')
380
381    def _bslash_(self):
382        self._ch('\\')
383
384    def _squote_(self):
385        self._ch("'")
386
387    def _dquote_(self):
388        self._ch('"')
389
390    def _esc_char_(self):
391        self._choose([self._esc_char__c0_, self._esc_char__c1_,
392                      self._esc_char__c2_, self._esc_char__c3_,
393                      self._esc_char__c4_, self._esc_char__c5_,
394                      self._esc_char__c6_, self._esc_char__c7_,
395                      self._esc_char__c8_, self._esc_char__c9_,
396                      self._esc_char__c10_])
397
398    def _esc_char__c0_(self):
399        self._seq([lambda: self._ch('b'), lambda: self._succeed('\b')])
400
401    def _esc_char__c1_(self):
402        self._seq([lambda: self._ch('f'), lambda: self._succeed('\f')])
403
404    def _esc_char__c10_(self):
405        self._push('esc_char__c10')
406        self._seq([lambda: self._bind(self._unicode_esc_, 'c'),
407                   lambda: self._succeed(self._get('c'))])
408        self._pop('esc_char__c10')
409
410    def _esc_char__c2_(self):
411        self._seq([lambda: self._ch('n'), lambda: self._succeed('\n')])
412
413    def _esc_char__c3_(self):
414        self._seq([lambda: self._ch('r'), lambda: self._succeed('\r')])
415
416    def _esc_char__c4_(self):
417        self._seq([lambda: self._ch('t'), lambda: self._succeed('\t')])
418
419    def _esc_char__c5_(self):
420        self._seq([lambda: self._ch('v'), lambda: self._succeed('\v')])
421
422    def _esc_char__c6_(self):
423        self._seq([self._squote_, lambda: self._succeed("'")])
424
425    def _esc_char__c7_(self):
426        self._seq([self._dquote_, lambda: self._succeed('"')])
427
428    def _esc_char__c8_(self):
429        self._seq([self._bslash_, lambda: self._succeed('\\')])
430
431    def _esc_char__c9_(self):
432        self._push('esc_char__c9')
433        self._seq([lambda: self._bind(self._hex_esc_, 'c'),
434                   lambda: self._succeed(self._get('c'))])
435        self._pop('esc_char__c9')
436
437    def _hex_esc_(self):
438        self._push('hex_esc')
439        self._seq([lambda: self._ch('x'), lambda: self._bind(self._hex_, 'h1'),
440                   lambda: self._bind(self._hex_, 'h2'),
441                   lambda: self._succeed(self._xtou(self._get('h1') + self._get('h2')))])
442        self._pop('hex_esc')
443
444    def _unicode_esc_(self):
445        self._push('unicode_esc')
446        self._seq([lambda: self._ch('u'), lambda: self._bind(self._hex_, 'a'),
447                   lambda: self._bind(self._hex_, 'b'),
448                   lambda: self._bind(self._hex_, 'c'),
449                   lambda: self._bind(self._hex_, 'd'),
450                   lambda: self._succeed(self._xtou(self._get('a') + self._get('b') + self._get('c') + self._get('d')))])
451        self._pop('unicode_esc')
452
453    def _element_list_(self):
454        self._push('element_list')
455        self._seq([lambda: self._bind(self._value_, 'v'),
456                   self._element_list__s1_, self._sp_, self._element_list__s3_,
457                   lambda: self._succeed([self._get('v')] + self._get('vs'))])
458        self._pop('element_list')
459
460    def _element_list__s1_(self):
461        self._bind(lambda: self._star(self._element_list__s1_l_p_), 'vs')
462
463    def _element_list__s1_l_p_(self):
464        self._seq([self._sp_, lambda: self._ch(','), self._sp_, self._value_])
465
466    def _element_list__s3_(self):
467        self._opt(lambda: self._ch(','))
468
469    def _member_list_(self):
470        self._push('member_list')
471        self._seq([lambda: self._bind(self._member_, 'm'),
472                   self._member_list__s1_, self._sp_, self._member_list__s3_,
473                   lambda: self._succeed([self._get('m')] + self._get('ms'))])
474        self._pop('member_list')
475
476    def _member_list__s1_(self):
477        self._bind(lambda: self._star(self._member_list__s1_l_p_), 'ms')
478
479    def _member_list__s1_l_p_(self):
480        self._seq([self._sp_, lambda: self._ch(','), self._sp_, self._member_])
481
482    def _member_list__s3_(self):
483        self._opt(lambda: self._ch(','))
484
485    def _member_(self):
486        self._choose([self._member__c0_, self._member__c1_])
487
488    def _member__c0_(self):
489        self._push('member__c0')
490        self._seq([lambda: self._bind(self._string_, 'k'), self._sp_,
491                   lambda: self._ch(':'), self._sp_,
492                   lambda: self._bind(self._value_, 'v'),
493                   lambda: self._succeed([self._get('k'), self._get('v')])])
494        self._pop('member__c0')
495
496    def _member__c1_(self):
497        self._push('member__c1')
498        self._seq([lambda: self._bind(self._ident_, 'k'), self._sp_,
499                   lambda: self._ch(':'), self._sp_,
500                   lambda: self._bind(self._value_, 'v'),
501                   lambda: self._succeed([self._get('k'), self._get('v')])])
502        self._pop('member__c1')
503
504    def _member_list_(self):
505        self._push('member_list')
506        self._seq([lambda: self._bind(self._member_, 'm'),
507                   self._member_list__s1_, self._sp_, self._member_list__s3_,
508                   lambda: self._succeed([self._get('m')] + self._get('ms'))])
509        self._pop('member_list')
510
511    def _member_list__s1_(self):
512        self._bind(lambda: self._star(self._member_list__s1_l_p_), 'ms')
513
514    def _member_list__s1_l_p_(self):
515        self._seq([self._sp_, lambda: self._ch(','), self._sp_, self._member_])
516
517    def _member_list__s3_(self):
518        self._opt(lambda: self._ch(','))
519
520    def _ident_(self):
521        self._push('ident')
522        self._seq([lambda: self._bind(self._id_start_, 'hd'), self._ident__s1_,
523                   lambda: self._succeed(self._join('', [self._get('hd')] + self._get('tl')))])
524        self._pop('ident')
525
526    def _ident__s1_(self):
527        self._bind(lambda: self._star(self._id_continue_), 'tl')
528
529    def _id_start_(self):
530        self._choose([self._ascii_id_start_, self._other_id_start_,
531                      self._id_start__c2_])
532
533    def _id_start__c2_(self):
534        self._seq([self._bslash_, self._unicode_esc_])
535
536    def _ascii_id_start_(self):
537        self._choose([self._ascii_id_start__c0_, self._ascii_id_start__c1_,
538                      self._ascii_id_start__c2_, self._ascii_id_start__c3_])
539
540    def _ascii_id_start__c0_(self):
541        self._range('a', 'z')
542
543    def _ascii_id_start__c1_(self):
544        self._range('A', 'Z')
545
546    def _ascii_id_start__c2_(self):
547        self._ch('$')
548
549    def _ascii_id_start__c3_(self):
550        self._ch('_')
551
552    def _other_id_start_(self):
553        self._choose([self._other_id_start__c0_, self._other_id_start__c1_,
554                      self._other_id_start__c2_, self._other_id_start__c3_,
555                      self._other_id_start__c4_, self._other_id_start__c5_])
556
557    def _other_id_start__c0_(self):
558        self._push('other_id_start__c0')
559        self._seq([lambda: self._bind(self._anything_, 'x'),
560                   self._other_id_start__c0__s1_,
561                   lambda: self._succeed(self._get('x'))])
562        self._pop('other_id_start__c0')
563
564    def _other_id_start__c0__s1_(self):
565        v = self._is_unicat(self._get('x'), 'Ll')
566        if v:
567            self._succeed(v)
568        else:
569            self._fail()
570
571    def _other_id_start__c1_(self):
572        self._push('other_id_start__c1')
573        self._seq([lambda: self._bind(self._anything_, 'x'),
574                   self._other_id_start__c1__s1_,
575                   lambda: self._succeed(self._get('x'))])
576        self._pop('other_id_start__c1')
577
578    def _other_id_start__c1__s1_(self):
579        v = self._is_unicat(self._get('x'), 'Lm')
580        if v:
581            self._succeed(v)
582        else:
583            self._fail()
584
585    def _other_id_start__c2_(self):
586        self._push('other_id_start__c2')
587        self._seq([lambda: self._bind(self._anything_, 'x'),
588                   self._other_id_start__c2__s1_,
589                   lambda: self._succeed(self._get('x'))])
590        self._pop('other_id_start__c2')
591
592    def _other_id_start__c2__s1_(self):
593        v = self._is_unicat(self._get('x'), 'Lo')
594        if v:
595            self._succeed(v)
596        else:
597            self._fail()
598
599    def _other_id_start__c3_(self):
600        self._push('other_id_start__c3')
601        self._seq([lambda: self._bind(self._anything_, 'x'),
602                   self._other_id_start__c3__s1_,
603                   lambda: self._succeed(self._get('x'))])
604        self._pop('other_id_start__c3')
605
606    def _other_id_start__c3__s1_(self):
607        v = self._is_unicat(self._get('x'), 'Lt')
608        if v:
609            self._succeed(v)
610        else:
611            self._fail()
612
613    def _other_id_start__c4_(self):
614        self._push('other_id_start__c4')
615        self._seq([lambda: self._bind(self._anything_, 'x'),
616                   self._other_id_start__c4__s1_,
617                   lambda: self._succeed(self._get('x'))])
618        self._pop('other_id_start__c4')
619
620    def _other_id_start__c4__s1_(self):
621        v = self._is_unicat(self._get('x'), 'Lu')
622        if v:
623            self._succeed(v)
624        else:
625            self._fail()
626
627    def _other_id_start__c5_(self):
628        self._push('other_id_start__c5')
629        self._seq([lambda: self._bind(self._anything_, 'x'),
630                   self._other_id_start__c5__s1_,
631                   lambda: self._succeed(self._get('x'))])
632        self._pop('other_id_start__c5')
633
634    def _other_id_start__c5__s1_(self):
635        v = self._is_unicat(self._get('x'), 'Nl')
636        if v:
637            self._succeed(v)
638        else:
639            self._fail()
640
641    def _id_continue_(self):
642        self._choose([self._ascii_id_start_, self._digit_,
643                      self._other_id_start_, self._id_continue__c3_,
644                      self._id_continue__c4_, self._id_continue__c5_,
645                      self._id_continue__c6_, self._id_continue__c7_,
646                      self._id_continue__c8_, self._id_continue__c9_])
647
648    def _id_continue__c3_(self):
649        self._push('id_continue__c3')
650        self._seq([lambda: self._bind(self._anything_, 'x'),
651                   self._id_continue__c3__s1_,
652                   lambda: self._succeed(self._get('x'))])
653        self._pop('id_continue__c3')
654
655    def _id_continue__c3__s1_(self):
656        v = self._is_unicat(self._get('x'), 'Mn')
657        if v:
658            self._succeed(v)
659        else:
660            self._fail()
661
662    def _id_continue__c4_(self):
663        self._push('id_continue__c4')
664        self._seq([lambda: self._bind(self._anything_, 'x'),
665                   self._id_continue__c4__s1_,
666                   lambda: self._succeed(self._get('x'))])
667        self._pop('id_continue__c4')
668
669    def _id_continue__c4__s1_(self):
670        v = self._is_unicat(self._get('x'), 'Mc')
671        if v:
672            self._succeed(v)
673        else:
674            self._fail()
675
676    def _id_continue__c5_(self):
677        self._push('id_continue__c5')
678        self._seq([lambda: self._bind(self._anything_, 'x'),
679                   self._id_continue__c5__s1_,
680                   lambda: self._succeed(self._get('x'))])
681        self._pop('id_continue__c5')
682
683    def _id_continue__c5__s1_(self):
684        v = self._is_unicat(self._get('x'), 'Nd')
685        if v:
686            self._succeed(v)
687        else:
688            self._fail()
689
690    def _id_continue__c6_(self):
691        self._push('id_continue__c6')
692        self._seq([lambda: self._bind(self._anything_, 'x'),
693                   self._id_continue__c6__s1_,
694                   lambda: self._succeed(self._get('x'))])
695        self._pop('id_continue__c6')
696
697    def _id_continue__c6__s1_(self):
698        v = self._is_unicat(self._get('x'), 'Pc')
699        if v:
700            self._succeed(v)
701        else:
702            self._fail()
703
704    def _id_continue__c7_(self):
705        self._seq([self._bslash_, self._unicode_esc_])
706
707    def _id_continue__c8_(self):
708        self._ch(u'\u200c')
709
710    def _id_continue__c9_(self):
711        self._ch(u'\u200d')
712
713    def _num_literal_(self):
714        self._choose([self._num_literal__c0_, self._num_literal__c1_,
715                      self._hex_literal_, self._num_literal__c3_,
716                      self._num_literal__c4_])
717
718    def _num_literal__c0_(self):
719        self._push('num_literal__c0')
720        self._seq([lambda: self._ch('-'),
721                   lambda: self._bind(self._num_literal_, 'n'),
722                   lambda: self._succeed('-' + self._get('n'))])
723        self._pop('num_literal__c0')
724
725    def _num_literal__c1_(self):
726        self._push('num_literal__c1')
727        self._seq([self._num_literal__c1__s0_,
728                   lambda: self._bind(self._dec_literal_, 'd'),
729                   lambda: self._not(self._id_start_),
730                   lambda: self._succeed(self._get('d'))])
731        self._pop('num_literal__c1')
732
733    def _num_literal__c1__s0_(self):
734        self._opt(lambda: self._ch('+'))
735
736    def _num_literal__c3_(self):
737        self._str('Infinity', 8)
738
739    def _num_literal__c4_(self):
740        self._str('NaN', 3)
741
742    def _dec_literal_(self):
743        self._choose([self._dec_literal__c0_, self._dec_literal__c1_,
744                      self._dec_literal__c2_, self._dec_literal__c3_,
745                      self._dec_literal__c4_, self._dec_literal__c5_])
746
747    def _dec_literal__c0_(self):
748        self._push('dec_literal__c0')
749        self._seq([lambda: self._bind(self._dec_int_lit_, 'd'),
750                   lambda: self._bind(self._frac_, 'f'),
751                   lambda: self._bind(self._exp_, 'e'),
752                   lambda: self._succeed(self._get('d') + self._get('f') + self._get('e'))])
753        self._pop('dec_literal__c0')
754
755    def _dec_literal__c1_(self):
756        self._push('dec_literal__c1')
757        self._seq([lambda: self._bind(self._dec_int_lit_, 'd'),
758                   lambda: self._bind(self._frac_, 'f'),
759                   lambda: self._succeed(self._get('d') + self._get('f'))])
760        self._pop('dec_literal__c1')
761
762    def _dec_literal__c2_(self):
763        self._push('dec_literal__c2')
764        self._seq([lambda: self._bind(self._dec_int_lit_, 'd'),
765                   lambda: self._bind(self._exp_, 'e'),
766                   lambda: self._succeed(self._get('d') + self._get('e'))])
767        self._pop('dec_literal__c2')
768
769    def _dec_literal__c3_(self):
770        self._push('dec_literal__c3')
771        self._seq([lambda: self._bind(self._dec_int_lit_, 'd'),
772                   lambda: self._succeed(self._get('d'))])
773        self._pop('dec_literal__c3')
774
775    def _dec_literal__c4_(self):
776        self._push('dec_literal__c4')
777        self._seq([lambda: self._bind(self._frac_, 'f'),
778                   lambda: self._bind(self._exp_, 'e'),
779                   lambda: self._succeed(self._get('f') + self._get('e'))])
780        self._pop('dec_literal__c4')
781
782    def _dec_literal__c5_(self):
783        self._push('dec_literal__c5')
784        self._seq([lambda: self._bind(self._frac_, 'f'),
785                   lambda: self._succeed(self._get('f'))])
786        self._pop('dec_literal__c5')
787
788    def _dec_int_lit_(self):
789        self._choose([self._dec_int_lit__c0_, self._dec_int_lit__c1_])
790
791    def _dec_int_lit__c0_(self):
792        self._seq([lambda: self._ch('0'), lambda: self._not(self._digit_),
793                   lambda: self._succeed('0')])
794
795    def _dec_int_lit__c1_(self):
796        self._push('dec_int_lit__c1')
797        self._seq([lambda: self._bind(self._nonzerodigit_, 'd'),
798                   self._dec_int_lit__c1__s1_,
799                   lambda: self._succeed(self._get('d') + self._join('', self._get('ds')))])
800        self._pop('dec_int_lit__c1')
801
802    def _dec_int_lit__c1__s1_(self):
803        self._bind(lambda: self._star(self._digit_), 'ds')
804
805    def _digit_(self):
806        self._range('0', '9')
807
808    def _nonzerodigit_(self):
809        self._range('1', '9')
810
811    def _hex_literal_(self):
812        self._push('hex_literal')
813        self._seq([self._hex_literal__s0_, self._hex_literal__s1_,
814                   lambda: self._succeed('0x' + self._join('', self._get('hs')))])
815        self._pop('hex_literal')
816
817    def _hex_literal__s0_(self):
818        self._choose([lambda: self._str('0x', 2), lambda: self._str('0X', 2)])
819
820    def _hex_literal__s1_(self):
821        self._bind(lambda: self._plus(self._hex_), 'hs')
822
823    def _hex_(self):
824        self._choose([self._hex__c0_, self._hex__c1_, self._digit_])
825
826    def _hex__c0_(self):
827        self._range('a', 'f')
828
829    def _hex__c1_(self):
830        self._range('A', 'F')
831
832    def _hex_esc_(self):
833        self._push('hex_esc')
834        self._seq([lambda: self._ch('x'), lambda: self._bind(self._hex_, 'h1'),
835                   lambda: self._bind(self._hex_, 'h2'),
836                   lambda: self._succeed(self._xtou(self._get('h1') + self._get('h2')))])
837        self._pop('hex_esc')
838
839    def _hex_literal_(self):
840        self._push('hex_literal')
841        self._seq([self._hex_literal__s0_, self._hex_literal__s1_,
842                   lambda: self._succeed('0x' + self._join('', self._get('hs')))])
843        self._pop('hex_literal')
844
845    def _hex_literal__s0_(self):
846        self._choose([lambda: self._str('0x', 2), lambda: self._str('0X', 2)])
847
848    def _hex_literal__s1_(self):
849        self._bind(lambda: self._plus(self._hex_), 'hs')
850
851    def _frac_(self):
852        self._push('frac')
853        self._seq([lambda: self._ch('.'), self._frac__s1_,
854                   lambda: self._succeed('.' + self._join('', self._get('ds')))])
855        self._pop('frac')
856
857    def _frac__s1_(self):
858        self._bind(lambda: self._star(self._digit_), 'ds')
859
860    def _exp_(self):
861        self._choose([self._exp__c0_, self._exp__c1_])
862
863    def _exp__c0_(self):
864        self._push('exp__c0')
865        self._seq([self._exp__c0__s0_,
866                   lambda: self._bind(self._exp__c0__s1_l_, 's'),
867                   self._exp__c0__s2_,
868                   lambda: self._succeed('e' + self._get('s') + self._join('', self._get('ds')))])
869        self._pop('exp__c0')
870
871    def _exp__c0__s0_(self):
872        self._choose([lambda: self._ch('e'), lambda: self._ch('E')])
873
874    def _exp__c0__s1_l_(self):
875        self._choose([lambda: self._ch('+'), lambda: self._ch('-')])
876
877    def _exp__c0__s2_(self):
878        self._bind(lambda: self._star(self._digit_), 'ds')
879
880    def _exp__c1_(self):
881        self._push('exp__c1')
882        self._seq([self._exp__c1__s0_, self._exp__c1__s1_,
883                   lambda: self._succeed('e' + self._join('', self._get('ds')))])
884        self._pop('exp__c1')
885
886    def _exp__c1__s0_(self):
887        self._choose([lambda: self._ch('e'), lambda: self._ch('E')])
888
889    def _exp__c1__s1_(self):
890        self._bind(lambda: self._star(self._digit_), 'ds')
891
892    def _anything_(self):
893        if self.pos < self.end:
894            self._succeed(self.msg[self.pos], self.pos + 1)
895        else:
896            self._fail()
897
898    def _end_(self):
899        if self.pos == self.end:
900            self._succeed(None)
901        else:
902            self._fail()
903