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