| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341 |
- # Generated by glop version 0.8.3
- # https://github.com/dpranke/glop
- # `glop -o json5/parser.py --no-main --no-memoize -c json5/json5.g`
- # pylint: disable=line-too-long,too-many-lines
- # pylint: disable=unnecessary-lambda,unnecessary-direct-lambda-call
- import unicodedata
- class Parser:
- def __init__(self, msg, fname, pos=0):
- self.msg = msg
- self.end = len(self.msg)
- self.fname = fname
- self.val = None
- self.pos = pos
- self.failed = False
- self.errpos = pos
- self._scopes = []
- self._cache = {}
- self._global_vars = {}
- def parse(self, global_vars=None):
- self._global_vars = global_vars or {}
- 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 = f'"{self.msg[self.errpos]}"'
- return f'{self.fname}:{lineno} Unexpected {thing} at column {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
- self.errpos = max(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
- errpos = self.errpos
- rule()
- if self.failed:
- self._succeed(None, p)
- else:
- self._rewind(p)
- self.errpos = errpos
- 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 True:
- p = self.pos
- rule()
- if self.failed:
- self._rewind(p)
- break
- 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):
- if self._scopes and var in self._scopes[-1][1]:
- return self._scopes[-1][1][var]
- return self._global_vars[var]
- def _set(self, var, val):
- self._scopes[-1][1][var] = val
- def _is_unicat(self, var, cat):
- 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._trailing_,
- lambda: self._succeed(self._get('v')),
- ]
- )
- self._pop('grammar')
- def _trailing_(self):
- self._choose([self._trailing__c0_, self._trailing__c1_])
- def _trailing__c0_(self):
- self._seq([self._trailing__c0__s0_, self._sp_, self._end_])
- def _trailing__c0__s0_(self):
- v = self._get('_consume_trailing')
- if v:
- self._succeed(v)
- else:
- self._fail()
- def _trailing__c1_(self):
- self._not(self._trailing__c1_n_)
- def _trailing__c1_n_(self):
- v = self._get('_consume_trailing')
- if v:
- self._succeed(v)
- else:
- self._fail()
- 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('\xa0')
- def _ws__c7_(self):
- self._ch('\ufeff')
- def _ws__c8_(self):
- self._push('ws__c8')
- self._seq(
- [
- self._ws__c8__s0_,
- lambda: self._bind(self._anything_, 'x'),
- lambda: self._succeed(self._get('x')),
- ]
- )
- self._pop('ws__c8')
- def _ws__c8__s0_(self):
- self._not(lambda: self._not(self._ws__c8__s0_n_n_))
- def _ws__c8__s0_n_n_(self):
- (lambda: self._choose([self._ws__c8__s0_n_n_g__c0_]))()
- def _ws__c8__s0_n_n_g__c0_(self):
- self._seq(
- [
- lambda: self._bind(self._anything_, 'x'),
- self._ws__c8__s0_n_n_g__c0__s1_,
- ]
- )
- def _ws__c8__s0_n_n_g__c0__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('\u2028')
- def _eol__c4_(self):
- self._ch('\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_,
- self._sqchar__c3_,
- ]
- )
- 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 _sqchar__c3_(self):
- self._seq(
- [
- lambda: self._not(self._sqchar__c3__s0_n_),
- lambda: self._range('\x00', '\x1f'),
- ]
- )
- def _sqchar__c3__s0_n_(self):
- v = self._get('_strict')
- if v:
- self._succeed(v)
- else:
- self._fail()
- def _dqchar_(self):
- self._choose(
- [
- self._dqchar__c0_,
- self._dqchar__c1_,
- self._dqchar__c2_,
- self._dqchar__c3_,
- ]
- )
- 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 _dqchar__c3_(self):
- self._seq(
- [
- lambda: self._not(self._dqchar__c3__s0_n_),
- lambda: self._range('\x00', '\x1f'),
- ]
- )
- def _dqchar__c3__s0_n_(self):
- v = self._get('_strict')
- if v:
- self._succeed(v)
- else:
- self._fail()
- 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('\u200c')
- def _id_continue__c9_(self):
- self._ch('\u200d')
- def _num_literal_(self):
- self._choose(
- [
- self._num_literal__c0_,
- self._num_literal__c1_,
- self._num_literal__c2_,
- ]
- )
- def _num_literal__c0_(self):
- self._push('num_literal__c0')
- self._seq(
- [
- lambda: self._ch('-'),
- lambda: self._bind(self._unsigned_lit_, 'n'),
- lambda: self._succeed('-' + self._get('n')),
- ]
- )
- self._pop('num_literal__c0')
- def _num_literal__c1_(self):
- self._push('num_literal__c1')
- self._seq(
- [
- lambda: self._ch('+'),
- lambda: self._bind(self._unsigned_lit_, 'n'),
- lambda: self._succeed(self._get('n')),
- ]
- )
- self._pop('num_literal__c1')
- def _num_literal__c2_(self):
- self._push('num_literal__c2')
- self._seq(
- [
- lambda: self._bind(self._unsigned_lit_, 'n'),
- lambda: self._succeed(self._get('n')),
- ]
- )
- self._pop('num_literal__c2')
- def _unsigned_lit_(self):
- self._choose(
- [
- self._unsigned_lit__c0_,
- self._hex_literal_,
- self._unsigned_lit__c2_,
- self._unsigned_lit__c3_,
- ]
- )
- def _unsigned_lit__c0_(self):
- self._push('unsigned_lit__c0')
- self._seq(
- [
- lambda: self._bind(self._dec_literal_, 'd'),
- lambda: self._not(self._id_start_),
- lambda: self._succeed(self._get('d')),
- ]
- )
- self._pop('unsigned_lit__c0')
- def _unsigned_lit__c2_(self):
- self._str('Infinity')
- def _unsigned_lit__c3_(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()
|