parser.py 36 KB

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