# pylint: disable=line-too-long,unnecessary-lambda import sys if sys.version_info[0] < 3: # pylint: disable=redefined-builtin,invalid-name chr = unichr range = xrange str = unicode class Parser(object): def __init__(self, msg, fname): self.msg = str(msg) self.end = len(self.msg) self.fname = fname self.val = None self.pos = 0 self.failed = False self.errpos = 0 self._scopes = [] self._cache = {} def parse(self): self._grammar_() if self.failed: return None, self._err_str(), self.errpos return self.val, None, self.pos def _err_str(self): lineno, colno = self._err_offsets() if self.errpos == len(self.msg): thing = 'end of input' else: thing = '"%s"' % self.msg[self.errpos] return '%s:%d Unexpected %s at column %d' % ( self.fname, lineno, thing, colno) def _err_offsets(self): lineno = 1 colno = 1 for i in range(self.errpos): if self.msg[i] == '\n': lineno += 1 colno = 1 else: colno += 1 return lineno, colno def _succeed(self, v, newpos=None): self.val = v self.failed = False if newpos is not None: self.pos = newpos def _fail(self): self.val = None self.failed = True if self.pos >= self.errpos: self.errpos = self.pos def _rewind(self, newpos): self._succeed(None, newpos) def _bind(self, rule, var): rule() if not self.failed: self._set(var, self.val) def _not(self, rule): p = self.pos rule() if self.failed: self._succeed(None, p) else: self._rewind(p) self._fail() def _opt(self, rule): p = self.pos rule() if self.failed: self._succeed([], p) else: self._succeed([self.val]) def _plus(self, rule): vs = [] rule() vs.append(self.val) if self.failed: return self._star(rule, vs) def _star(self, rule, vs=None): vs = vs or [] while not self.failed: p = self.pos rule() if self.failed: self._rewind(p) if p < self.errpos: self.errpos = p break else: vs.append(self.val) self._succeed(vs) def _seq(self, rules): for rule in rules: rule() if self.failed: return def _choose(self, rules): p = self.pos for rule in rules[:-1]: rule() if not self.failed: return self._rewind(p) rules[-1]() def _ch(self, ch): p = self.pos if p < self.end and self.msg[p] == ch: self._succeed(ch, self.pos + 1) else: self._fail() def _str(self, s): for ch in s: self._ch(ch) if self.failed: return self.val = s def _range(self, i, j): p = self.pos if p != self.end and ord(i) <= ord(self.msg[p]) <= ord(j): self._succeed(self.msg[p], self.pos + 1) else: self._fail() def _push(self, name): self._scopes.append((name, {})) def _pop(self, name): actual_name, _ = self._scopes.pop() assert name == actual_name def _get(self, var): return self._scopes[-1][1][var] def _set(self, var, val): self._scopes[-1][1][var] = val def _is_unicat(self, var, cat): import unicodedata return unicodedata.category(var) == cat def _join(self, s, vs): return s.join(vs) def _xtou(self, s): return chr(int(s, base=16)) def _grammar_(self): self._push('grammar') self._seq([self._sp_, lambda: self._bind(self._value_, 'v'), self._sp_, self._end_, lambda: self._succeed(self._get('v'))]) self._pop('grammar') def _sp_(self): self._star(self._ws_) def _ws_(self): self._choose([self._ws__c0_, self._eol_, self._comment_, self._ws__c3_, self._ws__c4_, self._ws__c5_, self._ws__c6_, self._ws__c7_, self._ws__c8_]) def _ws__c0_(self): self._ch(' ') def _ws__c3_(self): self._ch('\t') def _ws__c4_(self): self._ch('\v') def _ws__c5_(self): self._ch('\f') def _ws__c6_(self): self._ch(u'\xa0') def _ws__c7_(self): self._ch(u'\ufeff') def _ws__c8_(self): self._push('ws__c8') self._seq([lambda: self._bind(self._anything_, 'x'), self._ws__c8__s1_, lambda: self._succeed(self._get('x'))]) self._pop('ws__c8') def _ws__c8__s1_(self): v = self._is_unicat(self._get('x'), 'Zs') if v: self._succeed(v) else: self._fail() def _eol_(self): self._choose([self._eol__c0_, self._eol__c1_, self._eol__c2_, self._eol__c3_, self._eol__c4_]) def _eol__c0_(self): self._seq([lambda: self._ch('\r'), lambda: self._ch('\n')]) def _eol__c1_(self): self._ch('\r') def _eol__c2_(self): self._ch('\n') def _eol__c3_(self): self._ch(u'\u2028') def _eol__c4_(self): self._ch(u'\u2029') def _comment_(self): self._choose([self._comment__c0_, self._comment__c1_]) def _comment__c0_(self): self._seq([lambda: self._str('//'), lambda: self._star(self._comment__c0__s1_p_)]) def _comment__c0__s1_p_(self): self._seq([lambda: self._not(self._eol_), self._anything_]) def _comment__c1_(self): self._seq([lambda: self._str('/*'), self._comment__c1__s1_, lambda: self._str('*/')]) def _comment__c1__s1_(self): self._star(lambda: self._seq([self._comment__c1__s1_p__s0_, self._anything_])) def _comment__c1__s1_p__s0_(self): self._not(lambda: self._str('*/')) def _value_(self): self._choose([self._value__c0_, self._value__c1_, self._value__c2_, self._value__c3_, self._value__c4_, self._value__c5_, self._value__c6_]) def _value__c0_(self): self._seq([lambda: self._str('null'), lambda: self._succeed('None')]) def _value__c1_(self): self._seq([lambda: self._str('true'), lambda: self._succeed('True')]) def _value__c2_(self): self._seq([lambda: self._str('false'), lambda: self._succeed('False')]) def _value__c3_(self): self._push('value__c3') self._seq([lambda: self._bind(self._object_, 'v'), lambda: self._succeed(['object', self._get('v')])]) self._pop('value__c3') def _value__c4_(self): self._push('value__c4') self._seq([lambda: self._bind(self._array_, 'v'), lambda: self._succeed(['array', self._get('v')])]) self._pop('value__c4') def _value__c5_(self): self._push('value__c5') self._seq([lambda: self._bind(self._string_, 'v'), lambda: self._succeed(['string', self._get('v')])]) self._pop('value__c5') def _value__c6_(self): self._push('value__c6') self._seq([lambda: self._bind(self._num_literal_, 'v'), lambda: self._succeed(['number', self._get('v')])]) self._pop('value__c6') def _object_(self): self._choose([self._object__c0_, self._object__c1_]) def _object__c0_(self): self._push('object__c0') self._seq([lambda: self._ch('{'), self._sp_, lambda: self._bind(self._member_list_, 'v'), self._sp_, lambda: self._ch('}'), lambda: self._succeed(self._get('v'))]) self._pop('object__c0') def _object__c1_(self): self._seq([lambda: self._ch('{'), self._sp_, lambda: self._ch('}'), lambda: self._succeed([])]) def _array_(self): self._choose([self._array__c0_, self._array__c1_]) def _array__c0_(self): self._push('array__c0') self._seq([lambda: self._ch('['), self._sp_, lambda: self._bind(self._element_list_, 'v'), self._sp_, lambda: self._ch(']'), lambda: self._succeed(self._get('v'))]) self._pop('array__c0') def _array__c1_(self): self._seq([lambda: self._ch('['), self._sp_, lambda: self._ch(']'), lambda: self._succeed([])]) def _string_(self): self._choose([self._string__c0_, self._string__c1_]) def _string__c0_(self): self._push('string__c0') self._seq([self._squote_, self._string__c0__s1_, self._squote_, lambda: self._succeed(self._join('', self._get('cs')))]) self._pop('string__c0') def _string__c0__s1_(self): self._bind(lambda: self._star(self._sqchar_), 'cs') def _string__c1_(self): self._push('string__c1') self._seq([self._dquote_, self._string__c1__s1_, self._dquote_, lambda: self._succeed(self._join('', self._get('cs')))]) self._pop('string__c1') def _string__c1__s1_(self): self._bind(lambda: self._star(self._dqchar_), 'cs') def _sqchar_(self): self._choose([self._sqchar__c0_, self._sqchar__c1_, self._sqchar__c2_]) def _sqchar__c0_(self): self._push('sqchar__c0') self._seq([self._bslash_, lambda: self._bind(self._esc_char_, 'c'), lambda: self._succeed(self._get('c'))]) self._pop('sqchar__c0') def _sqchar__c1_(self): self._seq([self._bslash_, self._eol_, lambda: self._succeed('')]) def _sqchar__c2_(self): self._push('sqchar__c2') self._seq([lambda: self._not(self._bslash_), lambda: self._not(self._squote_), lambda: self._not(self._eol_), lambda: self._bind(self._anything_, 'c'), lambda: self._succeed(self._get('c'))]) self._pop('sqchar__c2') def _dqchar_(self): self._choose([self._dqchar__c0_, self._dqchar__c1_, self._dqchar__c2_]) def _dqchar__c0_(self): self._push('dqchar__c0') self._seq([self._bslash_, lambda: self._bind(self._esc_char_, 'c'), lambda: self._succeed(self._get('c'))]) self._pop('dqchar__c0') def _dqchar__c1_(self): self._seq([self._bslash_, self._eol_, lambda: self._succeed('')]) def _dqchar__c2_(self): self._push('dqchar__c2') self._seq([lambda: self._not(self._bslash_), lambda: self._not(self._dquote_), lambda: self._not(self._eol_), lambda: self._bind(self._anything_, 'c'), lambda: self._succeed(self._get('c'))]) self._pop('dqchar__c2') def _bslash_(self): self._ch('\\') def _squote_(self): self._ch("'") def _dquote_(self): self._ch('"') def _esc_char_(self): self._choose([self._esc_char__c0_, self._esc_char__c1_, self._esc_char__c2_, self._esc_char__c3_, self._esc_char__c4_, self._esc_char__c5_, self._esc_char__c6_, self._esc_char__c7_, self._esc_char__c8_, self._esc_char__c9_, self._esc_char__c10_, self._esc_char__c11_, self._esc_char__c12_]) def _esc_char__c0_(self): self._seq([lambda: self._ch('b'), lambda: self._succeed('\b')]) def _esc_char__c1_(self): self._seq([lambda: self._ch('f'), lambda: self._succeed('\f')]) def _esc_char__c10_(self): self._seq([lambda: self._ch('0'), lambda: self._not(self._digit_), lambda: self._succeed('\x00')]) def _esc_char__c11_(self): self._push('esc_char__c11') self._seq([lambda: self._bind(self._hex_esc_, 'c'), lambda: self._succeed(self._get('c'))]) self._pop('esc_char__c11') def _esc_char__c12_(self): self._push('esc_char__c12') self._seq([lambda: self._bind(self._unicode_esc_, 'c'), lambda: self._succeed(self._get('c'))]) self._pop('esc_char__c12') def _esc_char__c2_(self): self._seq([lambda: self._ch('n'), lambda: self._succeed('\n')]) def _esc_char__c3_(self): self._seq([lambda: self._ch('r'), lambda: self._succeed('\r')]) def _esc_char__c4_(self): self._seq([lambda: self._ch('t'), lambda: self._succeed('\t')]) def _esc_char__c5_(self): self._seq([lambda: self._ch('v'), lambda: self._succeed('\v')]) def _esc_char__c6_(self): self._seq([self._squote_, lambda: self._succeed("'")]) def _esc_char__c7_(self): self._seq([self._dquote_, lambda: self._succeed('"')]) def _esc_char__c8_(self): self._seq([self._bslash_, lambda: self._succeed('\\')]) def _esc_char__c9_(self): self._push('esc_char__c9') self._seq([self._esc_char__c9__s0_, lambda: self._bind(self._anything_, 'c'), lambda: self._succeed(self._get('c'))]) self._pop('esc_char__c9') def _esc_char__c9__s0_(self): self._not(lambda: (self._esc_char__c9__s0_n_g_)()) def _esc_char__c9__s0_n_g_(self): self._choose([self._esc_char__c9__s0_n_g__c0_, self._esc_char__c9__s0_n_g__c1_, lambda: self._seq([self._digit_]), lambda: self._seq([self._eol_])]) def _esc_char__c9__s0_n_g__c0_(self): self._seq([lambda: self._ch('x')]) def _esc_char__c9__s0_n_g__c1_(self): self._seq([lambda: self._ch('u')]) def _hex_esc_(self): self._push('hex_esc') self._seq([lambda: self._ch('x'), lambda: self._bind(self._hex_, 'h1'), lambda: self._bind(self._hex_, 'h2'), lambda: self._succeed(self._xtou(self._get('h1') + self._get('h2')))]) self._pop('hex_esc') def _unicode_esc_(self): self._push('unicode_esc') self._seq([lambda: self._ch('u'), lambda: self._bind(self._hex_, 'a'), lambda: self._bind(self._hex_, 'b'), lambda: self._bind(self._hex_, 'c'), lambda: self._bind(self._hex_, 'd'), lambda: self._succeed(self._xtou(self._get('a') + self._get('b') + self._get('c') + self._get('d')))]) self._pop('unicode_esc') def _element_list_(self): self._push('element_list') self._seq([lambda: self._bind(self._value_, 'v'), self._element_list__s1_, self._sp_, self._element_list__s3_, lambda: self._succeed([self._get('v')] + self._get('vs'))]) self._pop('element_list') def _element_list__s1_(self): self._bind(lambda: self._star(self._element_list__s1_l_p_), 'vs') def _element_list__s1_l_p_(self): self._seq([self._sp_, lambda: self._ch(','), self._sp_, self._value_]) def _element_list__s3_(self): self._opt(lambda: self._ch(',')) def _member_list_(self): self._push('member_list') self._seq([lambda: self._bind(self._member_, 'm'), self._member_list__s1_, self._sp_, self._member_list__s3_, lambda: self._succeed([self._get('m')] + self._get('ms'))]) self._pop('member_list') def _member_list__s1_(self): self._bind(lambda: self._star(self._member_list__s1_l_p_), 'ms') def _member_list__s1_l_p_(self): self._seq([self._sp_, lambda: self._ch(','), self._sp_, self._member_]) def _member_list__s3_(self): self._opt(lambda: self._ch(',')) def _member_(self): self._choose([self._member__c0_, self._member__c1_]) def _member__c0_(self): self._push('member__c0') self._seq([lambda: self._bind(self._string_, 'k'), self._sp_, lambda: self._ch(':'), self._sp_, lambda: self._bind(self._value_, 'v'), lambda: self._succeed([self._get('k'), self._get('v')])]) self._pop('member__c0') def _member__c1_(self): self._push('member__c1') self._seq([lambda: self._bind(self._ident_, 'k'), self._sp_, lambda: self._ch(':'), self._sp_, lambda: self._bind(self._value_, 'v'), lambda: self._succeed([self._get('k'), self._get('v')])]) self._pop('member__c1') def _ident_(self): self._push('ident') self._seq([lambda: self._bind(self._id_start_, 'hd'), self._ident__s1_, lambda: self._succeed(self._join('', [self._get('hd')] + self._get('tl')))]) self._pop('ident') def _ident__s1_(self): self._bind(lambda: self._star(self._id_continue_), 'tl') def _id_start_(self): self._choose([self._ascii_id_start_, self._other_id_start_, self._id_start__c2_]) def _id_start__c2_(self): self._seq([self._bslash_, self._unicode_esc_]) def _ascii_id_start_(self): self._choose([self._ascii_id_start__c0_, self._ascii_id_start__c1_, self._ascii_id_start__c2_, self._ascii_id_start__c3_]) def _ascii_id_start__c0_(self): self._range('a', 'z') def _ascii_id_start__c1_(self): self._range('A', 'Z') def _ascii_id_start__c2_(self): self._ch('$') def _ascii_id_start__c3_(self): self._ch('_') def _other_id_start_(self): self._choose([self._other_id_start__c0_, self._other_id_start__c1_, self._other_id_start__c2_, self._other_id_start__c3_, self._other_id_start__c4_, self._other_id_start__c5_]) def _other_id_start__c0_(self): self._push('other_id_start__c0') self._seq([lambda: self._bind(self._anything_, 'x'), self._other_id_start__c0__s1_, lambda: self._succeed(self._get('x'))]) self._pop('other_id_start__c0') def _other_id_start__c0__s1_(self): v = self._is_unicat(self._get('x'), 'Ll') if v: self._succeed(v) else: self._fail() def _other_id_start__c1_(self): self._push('other_id_start__c1') self._seq([lambda: self._bind(self._anything_, 'x'), self._other_id_start__c1__s1_, lambda: self._succeed(self._get('x'))]) self._pop('other_id_start__c1') def _other_id_start__c1__s1_(self): v = self._is_unicat(self._get('x'), 'Lm') if v: self._succeed(v) else: self._fail() def _other_id_start__c2_(self): self._push('other_id_start__c2') self._seq([lambda: self._bind(self._anything_, 'x'), self._other_id_start__c2__s1_, lambda: self._succeed(self._get('x'))]) self._pop('other_id_start__c2') def _other_id_start__c2__s1_(self): v = self._is_unicat(self._get('x'), 'Lo') if v: self._succeed(v) else: self._fail() def _other_id_start__c3_(self): self._push('other_id_start__c3') self._seq([lambda: self._bind(self._anything_, 'x'), self._other_id_start__c3__s1_, lambda: self._succeed(self._get('x'))]) self._pop('other_id_start__c3') def _other_id_start__c3__s1_(self): v = self._is_unicat(self._get('x'), 'Lt') if v: self._succeed(v) else: self._fail() def _other_id_start__c4_(self): self._push('other_id_start__c4') self._seq([lambda: self._bind(self._anything_, 'x'), self._other_id_start__c4__s1_, lambda: self._succeed(self._get('x'))]) self._pop('other_id_start__c4') def _other_id_start__c4__s1_(self): v = self._is_unicat(self._get('x'), 'Lu') if v: self._succeed(v) else: self._fail() def _other_id_start__c5_(self): self._push('other_id_start__c5') self._seq([lambda: self._bind(self._anything_, 'x'), self._other_id_start__c5__s1_, lambda: self._succeed(self._get('x'))]) self._pop('other_id_start__c5') def _other_id_start__c5__s1_(self): v = self._is_unicat(self._get('x'), 'Nl') if v: self._succeed(v) else: self._fail() def _id_continue_(self): self._choose([self._ascii_id_start_, self._digit_, self._other_id_start_, self._id_continue__c3_, self._id_continue__c4_, self._id_continue__c5_, self._id_continue__c6_, self._id_continue__c7_, self._id_continue__c8_, self._id_continue__c9_]) def _id_continue__c3_(self): self._push('id_continue__c3') self._seq([lambda: self._bind(self._anything_, 'x'), self._id_continue__c3__s1_, lambda: self._succeed(self._get('x'))]) self._pop('id_continue__c3') def _id_continue__c3__s1_(self): v = self._is_unicat(self._get('x'), 'Mn') if v: self._succeed(v) else: self._fail() def _id_continue__c4_(self): self._push('id_continue__c4') self._seq([lambda: self._bind(self._anything_, 'x'), self._id_continue__c4__s1_, lambda: self._succeed(self._get('x'))]) self._pop('id_continue__c4') def _id_continue__c4__s1_(self): v = self._is_unicat(self._get('x'), 'Mc') if v: self._succeed(v) else: self._fail() def _id_continue__c5_(self): self._push('id_continue__c5') self._seq([lambda: self._bind(self._anything_, 'x'), self._id_continue__c5__s1_, lambda: self._succeed(self._get('x'))]) self._pop('id_continue__c5') def _id_continue__c5__s1_(self): v = self._is_unicat(self._get('x'), 'Nd') if v: self._succeed(v) else: self._fail() def _id_continue__c6_(self): self._push('id_continue__c6') self._seq([lambda: self._bind(self._anything_, 'x'), self._id_continue__c6__s1_, lambda: self._succeed(self._get('x'))]) self._pop('id_continue__c6') def _id_continue__c6__s1_(self): v = self._is_unicat(self._get('x'), 'Pc') if v: self._succeed(v) else: self._fail() def _id_continue__c7_(self): self._seq([self._bslash_, self._unicode_esc_]) def _id_continue__c8_(self): self._ch(u'\u200c') def _id_continue__c9_(self): self._ch(u'\u200d') def _num_literal_(self): self._choose([self._num_literal__c0_, self._num_literal__c1_, self._hex_literal_, self._num_literal__c3_, self._num_literal__c4_]) def _num_literal__c0_(self): self._push('num_literal__c0') self._seq([lambda: self._ch('-'), lambda: self._bind(self._num_literal_, 'n'), lambda: self._succeed('-' + self._get('n'))]) self._pop('num_literal__c0') def _num_literal__c1_(self): self._push('num_literal__c1') self._seq([self._num_literal__c1__s0_, lambda: self._bind(self._dec_literal_, 'd'), lambda: self._not(self._id_start_), lambda: self._succeed(self._get('d'))]) self._pop('num_literal__c1') def _num_literal__c1__s0_(self): self._opt(lambda: self._ch('+')) def _num_literal__c3_(self): self._str('Infinity') def _num_literal__c4_(self): self._str('NaN') def _dec_literal_(self): self._choose([self._dec_literal__c0_, self._dec_literal__c1_, self._dec_literal__c2_, self._dec_literal__c3_, self._dec_literal__c4_, self._dec_literal__c5_]) def _dec_literal__c0_(self): self._push('dec_literal__c0') self._seq([lambda: self._bind(self._dec_int_lit_, 'd'), lambda: self._bind(self._frac_, 'f'), lambda: self._bind(self._exp_, 'e'), lambda: self._succeed(self._get('d') + self._get('f') + self._get('e'))]) self._pop('dec_literal__c0') def _dec_literal__c1_(self): self._push('dec_literal__c1') self._seq([lambda: self._bind(self._dec_int_lit_, 'd'), lambda: self._bind(self._frac_, 'f'), lambda: self._succeed(self._get('d') + self._get('f'))]) self._pop('dec_literal__c1') def _dec_literal__c2_(self): self._push('dec_literal__c2') self._seq([lambda: self._bind(self._dec_int_lit_, 'd'), lambda: self._bind(self._exp_, 'e'), lambda: self._succeed(self._get('d') + self._get('e'))]) self._pop('dec_literal__c2') def _dec_literal__c3_(self): self._push('dec_literal__c3') self._seq([lambda: self._bind(self._dec_int_lit_, 'd'), lambda: self._succeed(self._get('d'))]) self._pop('dec_literal__c3') def _dec_literal__c4_(self): self._push('dec_literal__c4') self._seq([lambda: self._bind(self._frac_, 'f'), lambda: self._bind(self._exp_, 'e'), lambda: self._succeed(self._get('f') + self._get('e'))]) self._pop('dec_literal__c4') def _dec_literal__c5_(self): self._push('dec_literal__c5') self._seq([lambda: self._bind(self._frac_, 'f'), lambda: self._succeed(self._get('f'))]) self._pop('dec_literal__c5') def _dec_int_lit_(self): self._choose([self._dec_int_lit__c0_, self._dec_int_lit__c1_]) def _dec_int_lit__c0_(self): self._seq([lambda: self._ch('0'), lambda: self._not(self._digit_), lambda: self._succeed('0')]) def _dec_int_lit__c1_(self): self._push('dec_int_lit__c1') self._seq([lambda: self._bind(self._nonzerodigit_, 'd'), self._dec_int_lit__c1__s1_, lambda: self._succeed(self._get('d') + self._join('', self._get('ds')))]) self._pop('dec_int_lit__c1') def _dec_int_lit__c1__s1_(self): self._bind(lambda: self._star(self._digit_), 'ds') def _digit_(self): self._range('0', '9') def _nonzerodigit_(self): self._range('1', '9') def _hex_literal_(self): self._push('hex_literal') self._seq([self._hex_literal__s0_, self._hex_literal__s1_, lambda: self._succeed('0x' + self._join('', self._get('hs')))]) self._pop('hex_literal') def _hex_literal__s0_(self): self._choose([lambda: self._str('0x'), lambda: self._str('0X')]) def _hex_literal__s1_(self): self._bind(lambda: self._plus(self._hex_), 'hs') def _hex_(self): self._choose([self._hex__c0_, self._hex__c1_, self._digit_]) def _hex__c0_(self): self._range('a', 'f') def _hex__c1_(self): self._range('A', 'F') def _frac_(self): self._push('frac') self._seq([lambda: self._ch('.'), self._frac__s1_, lambda: self._succeed('.' + self._join('', self._get('ds')))]) self._pop('frac') def _frac__s1_(self): self._bind(lambda: self._star(self._digit_), 'ds') def _exp_(self): self._choose([self._exp__c0_, self._exp__c1_]) def _exp__c0_(self): self._push('exp__c0') self._seq([self._exp__c0__s0_, lambda: self._bind(self._exp__c0__s1_l_, 's'), self._exp__c0__s2_, lambda: self._succeed('e' + self._get('s') + self._join('', self._get('ds')))]) self._pop('exp__c0') def _exp__c0__s0_(self): self._choose([lambda: self._ch('e'), lambda: self._ch('E')]) def _exp__c0__s1_l_(self): self._choose([lambda: self._ch('+'), lambda: self._ch('-')]) def _exp__c0__s2_(self): self._bind(lambda: self._star(self._digit_), 'ds') def _exp__c1_(self): self._push('exp__c1') self._seq([self._exp__c1__s0_, self._exp__c1__s1_, lambda: self._succeed('e' + self._join('', self._get('ds')))]) self._pop('exp__c1') def _exp__c1__s0_(self): self._choose([lambda: self._ch('e'), lambda: self._ch('E')]) def _exp__c1__s1_(self): self._bind(lambda: self._star(self._digit_), 'ds') def _anything_(self): if self.pos < self.end: self._succeed(self.msg[self.pos], self.pos + 1) else: self._fail() def _end_(self): if self.pos == self.end: self._succeed(None) else: self._fail()