Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.11/site-packages/json5/parser.py: 99%
Shortcuts on this page
r m x toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
Shortcuts on this page
r m x toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1# Generated by glop version 0.8.3
2# https://github.com/dpranke/glop
3# `glop -o json5/parser.py --no-main --no-memoize -c json5/json5.g`
5# pylint: disable=line-too-long,too-many-lines
6# pylint: disable=unnecessary-lambda,unnecessary-direct-lambda-call
8import unicodedata
11class Parser:
12 def __init__(self, msg, fname, pos=0):
13 self.msg = msg
14 self.end = len(self.msg)
15 self.fname = fname
16 self.val = None
17 self.pos = pos
18 self.failed = False
19 self.errpos = pos
20 self._scopes = []
21 self._cache = {}
22 self._global_vars = {}
24 def parse(self, global_vars=None):
25 self._global_vars = global_vars or {}
26 self._grammar_()
27 if self.failed:
28 return None, self._err_str(), self.errpos
29 return self.val, None, self.pos
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 = f'"{self.msg[self.errpos]}"'
37 return f'{self.fname}:{lineno} Unexpected {thing} at column {colno}'
39 def _err_offsets(self):
40 lineno = 1
41 colno = 1
42 for i in range(self.errpos):
43 if self.msg[i] == '\n':
44 lineno += 1
45 colno = 1
46 else:
47 colno += 1
48 return lineno, colno
50 def _succeed(self, v, newpos=None):
51 self.val = v
52 self.failed = False
53 if newpos is not None:
54 self.pos = newpos
56 def _fail(self):
57 self.val = None
58 self.failed = True
59 self.errpos = max(self.errpos, self.pos)
61 def _rewind(self, newpos):
62 self._succeed(None, newpos)
64 def _bind(self, rule, var):
65 rule()
66 if not self.failed:
67 self._set(var, self.val)
69 def _not(self, rule):
70 p = self.pos
71 errpos = self.errpos
72 rule()
73 if self.failed:
74 self._succeed(None, p)
75 else:
76 self._rewind(p)
77 self.errpos = errpos
78 self._fail()
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])
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)
96 def _star(self, rule, vs=None):
97 vs = vs or []
98 while True:
99 p = self.pos
100 rule()
101 if self.failed:
102 self._rewind(p)
103 break
104 vs.append(self.val)
105 self._succeed(vs)
107 def _seq(self, rules):
108 for rule in rules:
109 rule()
110 if self.failed:
111 return
113 def _choose(self, rules):
114 p = self.pos
115 for rule in rules[:-1]:
116 rule()
117 if not self.failed:
118 return
119 self._rewind(p)
120 rules[-1]()
122 def _ch(self, ch):
123 p = self.pos
124 if p < self.end and self.msg[p] == ch:
125 self._succeed(ch, self.pos + 1)
126 else:
127 self._fail()
129 def _str(self, s):
130 for ch in s:
131 self._ch(ch)
132 if self.failed:
133 return
134 self.val = s
136 def _range(self, i, j):
137 p = self.pos
138 if p != self.end and ord(i) <= ord(self.msg[p]) <= ord(j):
139 self._succeed(self.msg[p], self.pos + 1)
140 else:
141 self._fail()
143 def _push(self, name):
144 self._scopes.append((name, {}))
146 def _pop(self, name):
147 actual_name, _ = self._scopes.pop()
148 assert name == actual_name
150 def _get(self, var):
151 if self._scopes and var in self._scopes[-1][1]:
152 return self._scopes[-1][1][var]
153 return self._global_vars[var]
155 def _set(self, var, val):
156 self._scopes[-1][1][var] = val
158 def _is_unicat(self, var, cat):
159 return unicodedata.category(var) == cat
161 def _join(self, s, vs):
162 return s.join(vs)
164 def _xtou(self, s):
165 return chr(int(s, base=16))
167 def _grammar_(self):
168 self._push('grammar')
169 self._seq(
170 [
171 self._sp_,
172 lambda: self._bind(self._value_, 'v'),
173 self._trailing_,
174 lambda: self._succeed(self._get('v')),
175 ]
176 )
177 self._pop('grammar')
179 def _trailing_(self):
180 self._choose([self._trailing__c0_, self._trailing__c1_])
182 def _trailing__c0_(self):
183 self._seq([self._trailing__c0__s0_, self._sp_, self._end_])
185 def _trailing__c0__s0_(self):
186 v = self._get('_consume_trailing')
187 if v:
188 self._succeed(v)
189 else:
190 self._fail()
192 def _trailing__c1_(self):
193 self._not(self._trailing__c1_n_)
195 def _trailing__c1_n_(self):
196 v = self._get('_consume_trailing')
197 if v:
198 self._succeed(v)
199 else:
200 self._fail()
202 def _sp_(self):
203 self._star(self._ws_)
205 def _ws_(self):
206 self._choose(
207 [
208 self._ws__c0_,
209 self._eol_,
210 self._comment_,
211 self._ws__c3_,
212 self._ws__c4_,
213 self._ws__c5_,
214 self._ws__c6_,
215 self._ws__c7_,
216 self._ws__c8_,
217 ]
218 )
220 def _ws__c0_(self):
221 self._ch(' ')
223 def _ws__c3_(self):
224 self._ch('\t')
226 def _ws__c4_(self):
227 self._ch('\v')
229 def _ws__c5_(self):
230 self._ch('\f')
232 def _ws__c6_(self):
233 self._ch('\xa0')
235 def _ws__c7_(self):
236 self._ch('\ufeff')
238 def _ws__c8_(self):
239 self._push('ws__c8')
240 self._seq(
241 [
242 self._ws__c8__s0_,
243 lambda: self._bind(self._anything_, 'x'),
244 lambda: self._succeed(self._get('x')),
245 ]
246 )
247 self._pop('ws__c8')
249 def _ws__c8__s0_(self):
250 self._not(lambda: self._not(self._ws__c8__s0_n_n_))
252 def _ws__c8__s0_n_n_(self):
253 (lambda: self._choose([self._ws__c8__s0_n_n_g__c0_]))()
255 def _ws__c8__s0_n_n_g__c0_(self):
256 self._seq(
257 [
258 lambda: self._bind(self._anything_, 'x'),
259 self._ws__c8__s0_n_n_g__c0__s1_,
260 ]
261 )
263 def _ws__c8__s0_n_n_g__c0__s1_(self):
264 v = self._is_unicat(self._get('x'), 'Zs')
265 if v:
266 self._succeed(v)
267 else:
268 self._fail()
270 def _eol_(self):
271 self._choose(
272 [
273 self._eol__c0_,
274 self._eol__c1_,
275 self._eol__c2_,
276 self._eol__c3_,
277 self._eol__c4_,
278 ]
279 )
281 def _eol__c0_(self):
282 self._seq([lambda: self._ch('\r'), lambda: self._ch('\n')])
284 def _eol__c1_(self):
285 self._ch('\r')
287 def _eol__c2_(self):
288 self._ch('\n')
290 def _eol__c3_(self):
291 self._ch('\u2028')
293 def _eol__c4_(self):
294 self._ch('\u2029')
296 def _comment_(self):
297 self._choose([self._comment__c0_, self._comment__c1_])
299 def _comment__c0_(self):
300 self._seq(
301 [
302 lambda: self._str('//'),
303 lambda: self._star(self._comment__c0__s1_p_),
304 ]
305 )
307 def _comment__c0__s1_p_(self):
308 self._seq([lambda: self._not(self._eol_), self._anything_])
310 def _comment__c1_(self):
311 self._seq(
312 [
313 lambda: self._str('/*'),
314 self._comment__c1__s1_,
315 lambda: self._str('*/'),
316 ]
317 )
319 def _comment__c1__s1_(self):
320 self._star(
321 lambda: self._seq([self._comment__c1__s1_p__s0_, self._anything_])
322 )
324 def _comment__c1__s1_p__s0_(self):
325 self._not(lambda: self._str('*/'))
327 def _value_(self):
328 self._choose(
329 [
330 self._value__c0_,
331 self._value__c1_,
332 self._value__c2_,
333 self._value__c3_,
334 self._value__c4_,
335 self._value__c5_,
336 self._value__c6_,
337 ]
338 )
340 def _value__c0_(self):
341 self._seq([lambda: self._str('null'), lambda: self._succeed('None')])
343 def _value__c1_(self):
344 self._seq([lambda: self._str('true'), lambda: self._succeed('True')])
346 def _value__c2_(self):
347 self._seq([lambda: self._str('false'), lambda: self._succeed('False')])
349 def _value__c3_(self):
350 self._push('value__c3')
351 self._seq(
352 [
353 lambda: self._bind(self._object_, 'v'),
354 lambda: self._succeed(['object', self._get('v')]),
355 ]
356 )
357 self._pop('value__c3')
359 def _value__c4_(self):
360 self._push('value__c4')
361 self._seq(
362 [
363 lambda: self._bind(self._array_, 'v'),
364 lambda: self._succeed(['array', self._get('v')]),
365 ]
366 )
367 self._pop('value__c4')
369 def _value__c5_(self):
370 self._push('value__c5')
371 self._seq(
372 [
373 lambda: self._bind(self._string_, 'v'),
374 lambda: self._succeed(['string', self._get('v')]),
375 ]
376 )
377 self._pop('value__c5')
379 def _value__c6_(self):
380 self._push('value__c6')
381 self._seq(
382 [
383 lambda: self._bind(self._num_literal_, 'v'),
384 lambda: self._succeed(['number', self._get('v')]),
385 ]
386 )
387 self._pop('value__c6')
389 def _object_(self):
390 self._choose([self._object__c0_, self._object__c1_])
392 def _object__c0_(self):
393 self._push('object__c0')
394 self._seq(
395 [
396 lambda: self._ch('{'),
397 self._sp_,
398 lambda: self._bind(self._member_list_, 'v'),
399 self._sp_,
400 lambda: self._ch('}'),
401 lambda: self._succeed(self._get('v')),
402 ]
403 )
404 self._pop('object__c0')
406 def _object__c1_(self):
407 self._seq(
408 [
409 lambda: self._ch('{'),
410 self._sp_,
411 lambda: self._ch('}'),
412 lambda: self._succeed([]),
413 ]
414 )
416 def _array_(self):
417 self._choose([self._array__c0_, self._array__c1_])
419 def _array__c0_(self):
420 self._push('array__c0')
421 self._seq(
422 [
423 lambda: self._ch('['),
424 self._sp_,
425 lambda: self._bind(self._element_list_, 'v'),
426 self._sp_,
427 lambda: self._ch(']'),
428 lambda: self._succeed(self._get('v')),
429 ]
430 )
431 self._pop('array__c0')
433 def _array__c1_(self):
434 self._seq(
435 [
436 lambda: self._ch('['),
437 self._sp_,
438 lambda: self._ch(']'),
439 lambda: self._succeed([]),
440 ]
441 )
443 def _string_(self):
444 self._choose([self._string__c0_, self._string__c1_])
446 def _string__c0_(self):
447 self._push('string__c0')
448 self._seq(
449 [
450 self._squote_,
451 self._string__c0__s1_,
452 self._squote_,
453 lambda: self._succeed(self._join('', self._get('cs'))),
454 ]
455 )
456 self._pop('string__c0')
458 def _string__c0__s1_(self):
459 self._bind(lambda: self._star(self._sqchar_), 'cs')
461 def _string__c1_(self):
462 self._push('string__c1')
463 self._seq(
464 [
465 self._dquote_,
466 self._string__c1__s1_,
467 self._dquote_,
468 lambda: self._succeed(self._join('', self._get('cs'))),
469 ]
470 )
471 self._pop('string__c1')
473 def _string__c1__s1_(self):
474 self._bind(lambda: self._star(self._dqchar_), 'cs')
476 def _sqchar_(self):
477 self._choose(
478 [
479 self._sqchar__c0_,
480 self._sqchar__c1_,
481 self._sqchar__c2_,
482 self._sqchar__c3_,
483 ]
484 )
486 def _sqchar__c0_(self):
487 self._push('sqchar__c0')
488 self._seq(
489 [
490 self._bslash_,
491 lambda: self._bind(self._esc_char_, 'c'),
492 lambda: self._succeed(self._get('c')),
493 ]
494 )
495 self._pop('sqchar__c0')
497 def _sqchar__c1_(self):
498 self._seq([self._bslash_, self._eol_, lambda: self._succeed('')])
500 def _sqchar__c2_(self):
501 self._push('sqchar__c2')
502 self._seq(
503 [
504 lambda: self._not(self._bslash_),
505 lambda: self._not(self._squote_),
506 lambda: self._not(self._eol_),
507 lambda: self._bind(self._anything_, 'c'),
508 lambda: self._succeed(self._get('c')),
509 ]
510 )
511 self._pop('sqchar__c2')
513 def _sqchar__c3_(self):
514 self._seq(
515 [
516 lambda: self._not(self._sqchar__c3__s0_n_),
517 lambda: self._range('\x00', '\x1f'),
518 ]
519 )
521 def _sqchar__c3__s0_n_(self):
522 v = self._get('_strict')
523 if v:
524 self._succeed(v)
525 else:
526 self._fail()
528 def _dqchar_(self):
529 self._choose(
530 [
531 self._dqchar__c0_,
532 self._dqchar__c1_,
533 self._dqchar__c2_,
534 self._dqchar__c3_,
535 ]
536 )
538 def _dqchar__c0_(self):
539 self._push('dqchar__c0')
540 self._seq(
541 [
542 self._bslash_,
543 lambda: self._bind(self._esc_char_, 'c'),
544 lambda: self._succeed(self._get('c')),
545 ]
546 )
547 self._pop('dqchar__c0')
549 def _dqchar__c1_(self):
550 self._seq([self._bslash_, self._eol_, lambda: self._succeed('')])
552 def _dqchar__c2_(self):
553 self._push('dqchar__c2')
554 self._seq(
555 [
556 lambda: self._not(self._bslash_),
557 lambda: self._not(self._dquote_),
558 lambda: self._not(self._eol_),
559 lambda: self._bind(self._anything_, 'c'),
560 lambda: self._succeed(self._get('c')),
561 ]
562 )
563 self._pop('dqchar__c2')
565 def _dqchar__c3_(self):
566 self._seq(
567 [
568 lambda: self._not(self._dqchar__c3__s0_n_),
569 lambda: self._range('\x00', '\x1f'),
570 ]
571 )
573 def _dqchar__c3__s0_n_(self):
574 v = self._get('_strict')
575 if v:
576 self._succeed(v)
577 else:
578 self._fail()
580 def _bslash_(self):
581 self._ch('\\')
583 def _squote_(self):
584 self._ch("'")
586 def _dquote_(self):
587 self._ch('"')
589 def _esc_char_(self):
590 self._choose(
591 [
592 self._esc_char__c0_,
593 self._esc_char__c1_,
594 self._esc_char__c2_,
595 self._esc_char__c3_,
596 self._esc_char__c4_,
597 self._esc_char__c5_,
598 self._esc_char__c6_,
599 self._esc_char__c7_,
600 self._esc_char__c8_,
601 self._esc_char__c9_,
602 self._esc_char__c10_,
603 self._esc_char__c11_,
604 self._esc_char__c12_,
605 ]
606 )
608 def _esc_char__c0_(self):
609 self._seq([lambda: self._ch('b'), lambda: self._succeed('\b')])
611 def _esc_char__c1_(self):
612 self._seq([lambda: self._ch('f'), lambda: self._succeed('\f')])
614 def _esc_char__c10_(self):
615 self._seq(
616 [
617 lambda: self._ch('0'),
618 lambda: self._not(self._digit_),
619 lambda: self._succeed('\x00'),
620 ]
621 )
623 def _esc_char__c11_(self):
624 self._push('esc_char__c11')
625 self._seq(
626 [
627 lambda: self._bind(self._hex_esc_, 'c'),
628 lambda: self._succeed(self._get('c')),
629 ]
630 )
631 self._pop('esc_char__c11')
633 def _esc_char__c12_(self):
634 self._push('esc_char__c12')
635 self._seq(
636 [
637 lambda: self._bind(self._unicode_esc_, 'c'),
638 lambda: self._succeed(self._get('c')),
639 ]
640 )
641 self._pop('esc_char__c12')
643 def _esc_char__c2_(self):
644 self._seq([lambda: self._ch('n'), lambda: self._succeed('\n')])
646 def _esc_char__c3_(self):
647 self._seq([lambda: self._ch('r'), lambda: self._succeed('\r')])
649 def _esc_char__c4_(self):
650 self._seq([lambda: self._ch('t'), lambda: self._succeed('\t')])
652 def _esc_char__c5_(self):
653 self._seq([lambda: self._ch('v'), lambda: self._succeed('\v')])
655 def _esc_char__c6_(self):
656 self._seq([self._squote_, lambda: self._succeed("'")])
658 def _esc_char__c7_(self):
659 self._seq([self._dquote_, lambda: self._succeed('"')])
661 def _esc_char__c8_(self):
662 self._seq([self._bslash_, lambda: self._succeed('\\')])
664 def _esc_char__c9_(self):
665 self._push('esc_char__c9')
666 self._seq(
667 [
668 self._esc_char__c9__s0_,
669 lambda: self._bind(self._anything_, 'c'),
670 lambda: self._succeed(self._get('c')),
671 ]
672 )
673 self._pop('esc_char__c9')
675 def _esc_char__c9__s0_(self):
676 self._not(lambda: (self._esc_char__c9__s0_n_g_)())
678 def _esc_char__c9__s0_n_g_(self):
679 self._choose(
680 [
681 self._esc_char__c9__s0_n_g__c0_,
682 self._esc_char__c9__s0_n_g__c1_,
683 lambda: self._seq([self._digit_]),
684 lambda: self._seq([self._eol_]),
685 ]
686 )
688 def _esc_char__c9__s0_n_g__c0_(self):
689 self._seq([lambda: self._ch('x')])
691 def _esc_char__c9__s0_n_g__c1_(self):
692 self._seq([lambda: self._ch('u')])
694 def _hex_esc_(self):
695 self._push('hex_esc')
696 self._seq(
697 [
698 lambda: self._ch('x'),
699 lambda: self._bind(self._hex_, 'h1'),
700 lambda: self._bind(self._hex_, 'h2'),
701 lambda: self._succeed(
702 self._xtou(self._get('h1') + self._get('h2'))
703 ),
704 ]
705 )
706 self._pop('hex_esc')
708 def _unicode_esc_(self):
709 self._push('unicode_esc')
710 self._seq(
711 [
712 lambda: self._ch('u'),
713 lambda: self._bind(self._hex_, 'a'),
714 lambda: self._bind(self._hex_, 'b'),
715 lambda: self._bind(self._hex_, 'c'),
716 lambda: self._bind(self._hex_, 'd'),
717 lambda: self._succeed(
718 self._xtou(
719 self._get('a')
720 + self._get('b')
721 + self._get('c')
722 + self._get('d')
723 )
724 ),
725 ]
726 )
727 self._pop('unicode_esc')
729 def _element_list_(self):
730 self._push('element_list')
731 self._seq(
732 [
733 lambda: self._bind(self._value_, 'v'),
734 self._element_list__s1_,
735 self._sp_,
736 self._element_list__s3_,
737 lambda: self._succeed([self._get('v')] + self._get('vs')),
738 ]
739 )
740 self._pop('element_list')
742 def _element_list__s1_(self):
743 self._bind(lambda: self._star(self._element_list__s1_l_p_), 'vs')
745 def _element_list__s1_l_p_(self):
746 self._seq([self._sp_, lambda: self._ch(','), self._sp_, self._value_])
748 def _element_list__s3_(self):
749 self._opt(lambda: self._ch(','))
751 def _member_list_(self):
752 self._push('member_list')
753 self._seq(
754 [
755 lambda: self._bind(self._member_, 'm'),
756 self._member_list__s1_,
757 self._sp_,
758 self._member_list__s3_,
759 lambda: self._succeed([self._get('m')] + self._get('ms')),
760 ]
761 )
762 self._pop('member_list')
764 def _member_list__s1_(self):
765 self._bind(lambda: self._star(self._member_list__s1_l_p_), 'ms')
767 def _member_list__s1_l_p_(self):
768 self._seq([self._sp_, lambda: self._ch(','), self._sp_, self._member_])
770 def _member_list__s3_(self):
771 self._opt(lambda: self._ch(','))
773 def _member_(self):
774 self._choose([self._member__c0_, self._member__c1_])
776 def _member__c0_(self):
777 self._push('member__c0')
778 self._seq(
779 [
780 lambda: self._bind(self._string_, 'k'),
781 self._sp_,
782 lambda: self._ch(':'),
783 self._sp_,
784 lambda: self._bind(self._value_, 'v'),
785 lambda: self._succeed([self._get('k'), self._get('v')]),
786 ]
787 )
788 self._pop('member__c0')
790 def _member__c1_(self):
791 self._push('member__c1')
792 self._seq(
793 [
794 lambda: self._bind(self._ident_, 'k'),
795 self._sp_,
796 lambda: self._ch(':'),
797 self._sp_,
798 lambda: self._bind(self._value_, 'v'),
799 lambda: self._succeed([self._get('k'), self._get('v')]),
800 ]
801 )
802 self._pop('member__c1')
804 def _ident_(self):
805 self._push('ident')
806 self._seq(
807 [
808 lambda: self._bind(self._id_start_, 'hd'),
809 self._ident__s1_,
810 lambda: self._succeed(
811 self._join('', [self._get('hd')] + self._get('tl'))
812 ),
813 ]
814 )
815 self._pop('ident')
817 def _ident__s1_(self):
818 self._bind(lambda: self._star(self._id_continue_), 'tl')
820 def _id_start_(self):
821 self._choose(
822 [self._ascii_id_start_, self._other_id_start_, self._id_start__c2_]
823 )
825 def _id_start__c2_(self):
826 self._seq([self._bslash_, self._unicode_esc_])
828 def _ascii_id_start_(self):
829 self._choose(
830 [
831 self._ascii_id_start__c0_,
832 self._ascii_id_start__c1_,
833 self._ascii_id_start__c2_,
834 self._ascii_id_start__c3_,
835 ]
836 )
838 def _ascii_id_start__c0_(self):
839 self._range('a', 'z')
841 def _ascii_id_start__c1_(self):
842 self._range('A', 'Z')
844 def _ascii_id_start__c2_(self):
845 self._ch('$')
847 def _ascii_id_start__c3_(self):
848 self._ch('_')
850 def _other_id_start_(self):
851 self._choose(
852 [
853 self._other_id_start__c0_,
854 self._other_id_start__c1_,
855 self._other_id_start__c2_,
856 self._other_id_start__c3_,
857 self._other_id_start__c4_,
858 self._other_id_start__c5_,
859 ]
860 )
862 def _other_id_start__c0_(self):
863 self._push('other_id_start__c0')
864 self._seq(
865 [
866 lambda: self._bind(self._anything_, 'x'),
867 self._other_id_start__c0__s1_,
868 lambda: self._succeed(self._get('x')),
869 ]
870 )
871 self._pop('other_id_start__c0')
873 def _other_id_start__c0__s1_(self):
874 v = self._is_unicat(self._get('x'), 'Ll')
875 if v:
876 self._succeed(v)
877 else:
878 self._fail()
880 def _other_id_start__c1_(self):
881 self._push('other_id_start__c1')
882 self._seq(
883 [
884 lambda: self._bind(self._anything_, 'x'),
885 self._other_id_start__c1__s1_,
886 lambda: self._succeed(self._get('x')),
887 ]
888 )
889 self._pop('other_id_start__c1')
891 def _other_id_start__c1__s1_(self):
892 v = self._is_unicat(self._get('x'), 'Lm')
893 if v:
894 self._succeed(v)
895 else:
896 self._fail()
898 def _other_id_start__c2_(self):
899 self._push('other_id_start__c2')
900 self._seq(
901 [
902 lambda: self._bind(self._anything_, 'x'),
903 self._other_id_start__c2__s1_,
904 lambda: self._succeed(self._get('x')),
905 ]
906 )
907 self._pop('other_id_start__c2')
909 def _other_id_start__c2__s1_(self):
910 v = self._is_unicat(self._get('x'), 'Lo')
911 if v:
912 self._succeed(v)
913 else:
914 self._fail()
916 def _other_id_start__c3_(self):
917 self._push('other_id_start__c3')
918 self._seq(
919 [
920 lambda: self._bind(self._anything_, 'x'),
921 self._other_id_start__c3__s1_,
922 lambda: self._succeed(self._get('x')),
923 ]
924 )
925 self._pop('other_id_start__c3')
927 def _other_id_start__c3__s1_(self):
928 v = self._is_unicat(self._get('x'), 'Lt')
929 if v:
930 self._succeed(v)
931 else:
932 self._fail()
934 def _other_id_start__c4_(self):
935 self._push('other_id_start__c4')
936 self._seq(
937 [
938 lambda: self._bind(self._anything_, 'x'),
939 self._other_id_start__c4__s1_,
940 lambda: self._succeed(self._get('x')),
941 ]
942 )
943 self._pop('other_id_start__c4')
945 def _other_id_start__c4__s1_(self):
946 v = self._is_unicat(self._get('x'), 'Lu')
947 if v:
948 self._succeed(v)
949 else:
950 self._fail()
952 def _other_id_start__c5_(self):
953 self._push('other_id_start__c5')
954 self._seq(
955 [
956 lambda: self._bind(self._anything_, 'x'),
957 self._other_id_start__c5__s1_,
958 lambda: self._succeed(self._get('x')),
959 ]
960 )
961 self._pop('other_id_start__c5')
963 def _other_id_start__c5__s1_(self):
964 v = self._is_unicat(self._get('x'), 'Nl')
965 if v:
966 self._succeed(v)
967 else:
968 self._fail()
970 def _id_continue_(self):
971 self._choose(
972 [
973 self._ascii_id_start_,
974 self._digit_,
975 self._other_id_start_,
976 self._id_continue__c3_,
977 self._id_continue__c4_,
978 self._id_continue__c5_,
979 self._id_continue__c6_,
980 self._id_continue__c7_,
981 self._id_continue__c8_,
982 self._id_continue__c9_,
983 ]
984 )
986 def _id_continue__c3_(self):
987 self._push('id_continue__c3')
988 self._seq(
989 [
990 lambda: self._bind(self._anything_, 'x'),
991 self._id_continue__c3__s1_,
992 lambda: self._succeed(self._get('x')),
993 ]
994 )
995 self._pop('id_continue__c3')
997 def _id_continue__c3__s1_(self):
998 v = self._is_unicat(self._get('x'), 'Mn')
999 if v:
1000 self._succeed(v)
1001 else:
1002 self._fail()
1004 def _id_continue__c4_(self):
1005 self._push('id_continue__c4')
1006 self._seq(
1007 [
1008 lambda: self._bind(self._anything_, 'x'),
1009 self._id_continue__c4__s1_,
1010 lambda: self._succeed(self._get('x')),
1011 ]
1012 )
1013 self._pop('id_continue__c4')
1015 def _id_continue__c4__s1_(self):
1016 v = self._is_unicat(self._get('x'), 'Mc')
1017 if v:
1018 self._succeed(v)
1019 else:
1020 self._fail()
1022 def _id_continue__c5_(self):
1023 self._push('id_continue__c5')
1024 self._seq(
1025 [
1026 lambda: self._bind(self._anything_, 'x'),
1027 self._id_continue__c5__s1_,
1028 lambda: self._succeed(self._get('x')),
1029 ]
1030 )
1031 self._pop('id_continue__c5')
1033 def _id_continue__c5__s1_(self):
1034 v = self._is_unicat(self._get('x'), 'Nd')
1035 if v:
1036 self._succeed(v)
1037 else:
1038 self._fail()
1040 def _id_continue__c6_(self):
1041 self._push('id_continue__c6')
1042 self._seq(
1043 [
1044 lambda: self._bind(self._anything_, 'x'),
1045 self._id_continue__c6__s1_,
1046 lambda: self._succeed(self._get('x')),
1047 ]
1048 )
1049 self._pop('id_continue__c6')
1051 def _id_continue__c6__s1_(self):
1052 v = self._is_unicat(self._get('x'), 'Pc')
1053 if v:
1054 self._succeed(v)
1055 else:
1056 self._fail()
1058 def _id_continue__c7_(self):
1059 self._seq([self._bslash_, self._unicode_esc_])
1061 def _id_continue__c8_(self):
1062 self._ch('\u200c')
1064 def _id_continue__c9_(self):
1065 self._ch('\u200d')
1067 def _num_literal_(self):
1068 self._choose(
1069 [
1070 self._num_literal__c0_,
1071 self._num_literal__c1_,
1072 self._num_literal__c2_,
1073 ]
1074 )
1076 def _num_literal__c0_(self):
1077 self._push('num_literal__c0')
1078 self._seq(
1079 [
1080 lambda: self._ch('-'),
1081 lambda: self._bind(self._unsigned_lit_, 'n'),
1082 lambda: self._succeed('-' + self._get('n')),
1083 ]
1084 )
1085 self._pop('num_literal__c0')
1087 def _num_literal__c1_(self):
1088 self._push('num_literal__c1')
1089 self._seq(
1090 [
1091 lambda: self._ch('+'),
1092 lambda: self._bind(self._unsigned_lit_, 'n'),
1093 lambda: self._succeed(self._get('n')),
1094 ]
1095 )
1096 self._pop('num_literal__c1')
1098 def _num_literal__c2_(self):
1099 self._push('num_literal__c2')
1100 self._seq(
1101 [
1102 lambda: self._bind(self._unsigned_lit_, 'n'),
1103 lambda: self._succeed(self._get('n')),
1104 ]
1105 )
1106 self._pop('num_literal__c2')
1108 def _unsigned_lit_(self):
1109 self._choose(
1110 [
1111 self._unsigned_lit__c0_,
1112 self._hex_literal_,
1113 self._unsigned_lit__c2_,
1114 self._unsigned_lit__c3_,
1115 ]
1116 )
1118 def _unsigned_lit__c0_(self):
1119 self._push('unsigned_lit__c0')
1120 self._seq(
1121 [
1122 lambda: self._bind(self._dec_literal_, 'd'),
1123 lambda: self._not(self._id_start_),
1124 lambda: self._succeed(self._get('d')),
1125 ]
1126 )
1127 self._pop('unsigned_lit__c0')
1129 def _unsigned_lit__c2_(self):
1130 self._str('Infinity')
1132 def _unsigned_lit__c3_(self):
1133 self._str('NaN')
1135 def _dec_literal_(self):
1136 self._choose(
1137 [
1138 self._dec_literal__c0_,
1139 self._dec_literal__c1_,
1140 self._dec_literal__c2_,
1141 self._dec_literal__c3_,
1142 self._dec_literal__c4_,
1143 self._dec_literal__c5_,
1144 ]
1145 )
1147 def _dec_literal__c0_(self):
1148 self._push('dec_literal__c0')
1149 self._seq(
1150 [
1151 lambda: self._bind(self._dec_int_lit_, 'd'),
1152 lambda: self._bind(self._frac_, 'f'),
1153 lambda: self._bind(self._exp_, 'e'),
1154 lambda: self._succeed(
1155 self._get('d') + self._get('f') + self._get('e')
1156 ),
1157 ]
1158 )
1159 self._pop('dec_literal__c0')
1161 def _dec_literal__c1_(self):
1162 self._push('dec_literal__c1')
1163 self._seq(
1164 [
1165 lambda: self._bind(self._dec_int_lit_, 'd'),
1166 lambda: self._bind(self._frac_, 'f'),
1167 lambda: self._succeed(self._get('d') + self._get('f')),
1168 ]
1169 )
1170 self._pop('dec_literal__c1')
1172 def _dec_literal__c2_(self):
1173 self._push('dec_literal__c2')
1174 self._seq(
1175 [
1176 lambda: self._bind(self._dec_int_lit_, 'd'),
1177 lambda: self._bind(self._exp_, 'e'),
1178 lambda: self._succeed(self._get('d') + self._get('e')),
1179 ]
1180 )
1181 self._pop('dec_literal__c2')
1183 def _dec_literal__c3_(self):
1184 self._push('dec_literal__c3')
1185 self._seq(
1186 [
1187 lambda: self._bind(self._dec_int_lit_, 'd'),
1188 lambda: self._succeed(self._get('d')),
1189 ]
1190 )
1191 self._pop('dec_literal__c3')
1193 def _dec_literal__c4_(self):
1194 self._push('dec_literal__c4')
1195 self._seq(
1196 [
1197 lambda: self._bind(self._frac_, 'f'),
1198 lambda: self._bind(self._exp_, 'e'),
1199 lambda: self._succeed(self._get('f') + self._get('e')),
1200 ]
1201 )
1202 self._pop('dec_literal__c4')
1204 def _dec_literal__c5_(self):
1205 self._push('dec_literal__c5')
1206 self._seq(
1207 [
1208 lambda: self._bind(self._frac_, 'f'),
1209 lambda: self._succeed(self._get('f')),
1210 ]
1211 )
1212 self._pop('dec_literal__c5')
1214 def _dec_int_lit_(self):
1215 self._choose([self._dec_int_lit__c0_, self._dec_int_lit__c1_])
1217 def _dec_int_lit__c0_(self):
1218 self._seq(
1219 [
1220 lambda: self._ch('0'),
1221 lambda: self._not(self._digit_),
1222 lambda: self._succeed('0'),
1223 ]
1224 )
1226 def _dec_int_lit__c1_(self):
1227 self._push('dec_int_lit__c1')
1228 self._seq(
1229 [
1230 lambda: self._bind(self._nonzerodigit_, 'd'),
1231 self._dec_int_lit__c1__s1_,
1232 lambda: self._succeed(
1233 self._get('d') + self._join('', self._get('ds'))
1234 ),
1235 ]
1236 )
1237 self._pop('dec_int_lit__c1')
1239 def _dec_int_lit__c1__s1_(self):
1240 self._bind(lambda: self._star(self._digit_), 'ds')
1242 def _digit_(self):
1243 self._range('0', '9')
1245 def _nonzerodigit_(self):
1246 self._range('1', '9')
1248 def _hex_literal_(self):
1249 self._push('hex_literal')
1250 self._seq(
1251 [
1252 self._hex_literal__s0_,
1253 self._hex_literal__s1_,
1254 lambda: self._succeed('0x' + self._join('', self._get('hs'))),
1255 ]
1256 )
1257 self._pop('hex_literal')
1259 def _hex_literal__s0_(self):
1260 self._choose([lambda: self._str('0x'), lambda: self._str('0X')])
1262 def _hex_literal__s1_(self):
1263 self._bind(lambda: self._plus(self._hex_), 'hs')
1265 def _hex_(self):
1266 self._choose([self._hex__c0_, self._hex__c1_, self._digit_])
1268 def _hex__c0_(self):
1269 self._range('a', 'f')
1271 def _hex__c1_(self):
1272 self._range('A', 'F')
1274 def _frac_(self):
1275 self._push('frac')
1276 self._seq(
1277 [
1278 lambda: self._ch('.'),
1279 self._frac__s1_,
1280 lambda: self._succeed('.' + self._join('', self._get('ds'))),
1281 ]
1282 )
1283 self._pop('frac')
1285 def _frac__s1_(self):
1286 self._bind(lambda: self._star(self._digit_), 'ds')
1288 def _exp_(self):
1289 self._choose([self._exp__c0_, self._exp__c1_])
1291 def _exp__c0_(self):
1292 self._push('exp__c0')
1293 self._seq(
1294 [
1295 self._exp__c0__s0_,
1296 lambda: self._bind(self._exp__c0__s1_l_, 's'),
1297 self._exp__c0__s2_,
1298 lambda: self._succeed(
1299 'e' + self._get('s') + self._join('', self._get('ds'))
1300 ),
1301 ]
1302 )
1303 self._pop('exp__c0')
1305 def _exp__c0__s0_(self):
1306 self._choose([lambda: self._ch('e'), lambda: self._ch('E')])
1308 def _exp__c0__s1_l_(self):
1309 self._choose([lambda: self._ch('+'), lambda: self._ch('-')])
1311 def _exp__c0__s2_(self):
1312 self._bind(lambda: self._star(self._digit_), 'ds')
1314 def _exp__c1_(self):
1315 self._push('exp__c1')
1316 self._seq(
1317 [
1318 self._exp__c1__s0_,
1319 self._exp__c1__s1_,
1320 lambda: self._succeed('e' + self._join('', self._get('ds'))),
1321 ]
1322 )
1323 self._pop('exp__c1')
1325 def _exp__c1__s0_(self):
1326 self._choose([lambda: self._ch('e'), lambda: self._ch('E')])
1328 def _exp__c1__s1_(self):
1329 self._bind(lambda: self._star(self._digit_), 'ds')
1331 def _anything_(self):
1332 if self.pos < self.end:
1333 self._succeed(self.msg[self.pos], self.pos + 1)
1334 else:
1335 self._fail()
1337 def _end_(self):
1338 if self.pos == self.end:
1339 self._succeed(None)
1340 else:
1341 self._fail()