fork download
  1. import collections
  2.  
  3. equal_class = collections.OrderedDict()
  4.  
  5. equal_class['END_EQCLS'] = {'bits': 0, 'body':[] }
  6. equal_class['ENT_EQCLS'] = {'bits': 3, 'body':['', '{}[]:,', ' \t\r\n', '"', '-0123456789', 't', 'f', 'n']}
  7. equal_class['STR_EQCLS'] = {'bits': 2, 'body':['', '\0', '"', '\\']}
  8. equal_class['ESC_EQCLS'] = {'bits': 2, 'body':['', '\\rftnb"/', 'u']}
  9. equal_class['HEX_EQCLS'] = {'bits': 1, 'body':['', '0123456789abcdefABCDEF']}
  10. equal_class['NUM_EQCLS'] = {'bits': 2, 'body':['', '-', '0', '123456789']}
  11. equal_class['FRAC_EQCLS'] ={'bits': 2, 'body':['', '.', 'eE', '0123456789']}
  12. equal_class['EXP_EQCLS'] = {'bits': 2, 'body':['', '+-', '0123456789']}
  13. equal_class['TRUE_T_EQCLS'] = {'bits': 1, 'body':['', 'r']}
  14. equal_class['TRUE_R_EQCLS'] = {'bits': 1, 'body':['', 'u']}
  15. equal_class['TRUE_U_EQCLS'] = {'bits': 1, 'body':['', 'e']}
  16. equal_class['FALSE_F_EQCLS'] = {'bits': 1, 'body':['', 'a']}
  17. equal_class['FALSE_A_EQCLS'] = {'bits': 1, 'body':['', 'l']}
  18. equal_class['FALSE_L_EQCLS'] = {'bits': 1, 'body':['', 's']}
  19. equal_class['FALSE_S_EQCLS'] = {'bits': 1, 'body':['', 'e']}
  20. equal_class['NULL_N_EQCLS'] = {'bits': 1, 'body':['', 'u']}
  21. equal_class['NULL_U_EQCLS'] = {'bits': 1, 'body':['', 'l']}
  22.  
  23. # flag : txt_inc, src_not_inc, tok_inc
  24. states = [
  25. {
  26. 'state': 'END',
  27. 'body': ['END'],
  28. 'flag': ['010'],
  29. 'eqcls': 'END_EQCLS'
  30. },
  31. {
  32. 'state': 'ENT',
  33. 'body': ['END', 'ENT', 'ENT', 'STR', 'NUM', 'TRUE_T', 'FALSE_F', 'NULL_N'],
  34. 'flag': ['010', '101', '100', '110', '010', '110', '110', '110' ],
  35. 'eqcls': 'ENT_EQCLS'
  36. },
  37. {
  38. 'state': 'STR',
  39. 'body': ['STR', 'END', 'ENT', 'ESC'],
  40. 'flag': ['110', '010', '101', '110'],
  41. 'eqcls': 'STR_EQCLS'
  42. },
  43. {
  44. 'state': 'ESC',
  45. 'body': ['END', 'STR', 'HEX'],
  46. 'flag': ['010', '110', '110'],
  47. 'eqcls': 'ESC_EQCLS'
  48. },
  49. {
  50. 'state': 'HEX',
  51. 'body': ['END', 'HEX1'],
  52. 'flag': ['010', '110'],
  53. 'eqcls': 'HEX_EQCLS'
  54. },
  55. {
  56. 'state': 'HEX1',
  57. 'body': ['END', 'HEX2'],
  58. 'flag': ['010', '110'],
  59. 'eqcls': 'HEX_EQCLS'
  60. },
  61. {
  62. 'state': 'HEX2',
  63. 'body': ['END', 'HEX3'],
  64. 'flag': ['010', '110'],
  65. 'eqcls': 'HEX_EQCLS'
  66. },
  67. {
  68. 'state': 'HEX3',
  69. 'body': ['END', 'STR'],
  70. 'flag': ['010', '110'],
  71. 'eqcls': 'HEX_EQCLS'
  72. },
  73. {
  74. 'state': 'NUM',
  75. 'body': ['END', 'MINUS', 'ZERO', 'ONENINE'],
  76. 'flag': ['010', '110', '110', '110' ],
  77. 'eqcls': 'NUM_EQCLS'
  78. },
  79. {
  80. 'state': 'MINUS',
  81. 'body': ['END', 'END', 'ZERO', 'ONENINE'],
  82. 'flag': ['010', '010', '110', '110' ],
  83. 'eqcls': 'NUM_EQCLS'
  84. },
  85. {
  86. 'state': 'ZERO',
  87. 'body': ['FRAC_S', 'END', 'END', 'END'],
  88. 'flag': ['010', '010', '010', '010'],
  89. 'eqcls': 'NUM_EQCLS'
  90. },
  91. {
  92. 'state': 'ONENINE',
  93. 'body': ['FRAC_S', 'END', 'ONENINE', 'ONENINE'],
  94. 'flag': ['010', '010', '110', '110'],
  95. 'eqcls': 'NUM_EQCLS',
  96. },
  97. {
  98. 'state': 'FRAC_S',
  99. 'body': ['ENT', 'FRAC_O', 'EXP_S', 'END'],
  100. 'flag': ['001', '110', '110', '010'],
  101. 'eqcls': 'FRAC_EQCLS',
  102. },
  103. {
  104. 'state': 'FRAC_O',
  105. 'body': ['ENT', 'END', 'EXP_S', 'FRAC_O'],
  106. 'flag': ['001', '010', '110', '110'],
  107. 'eqcls': 'FRAC_EQCLS',
  108. },
  109. {
  110. 'state': 'EXP_S',
  111. 'body': ['END', 'EXP_O', 'EXP_O'],
  112. 'flag': ['010', '110', '110'],
  113. 'eqcls': 'EXP_EQCLS',
  114. },
  115. {
  116. 'state': 'EXP_O',
  117. 'body': ['ENT', 'END', 'EXP_O'],
  118. 'flag': ['001', '010', '110'],
  119. 'eqcls': 'EXP_EQCLS',
  120. },
  121. {
  122. 'state': 'TRUE_T',
  123. 'body': ['END', 'TRUE_R'],
  124. 'flag': ['010', '110'],
  125. 'eqcls': 'TRUE_T_EQCLS',
  126. },
  127. {
  128. 'state': 'TRUE_R',
  129. 'body': ['END', 'TRUE_U'],
  130. 'flag': ['010', '110'],
  131. 'eqcls': 'TRUE_R_EQCLS',
  132. },
  133. {
  134. 'state': 'TRUE_U',
  135. 'body': ['END', 'ENT'],
  136. 'flag': ['010', '101'],
  137. 'eqcls': 'TRUE_U_EQCLS',
  138. },
  139. {
  140. 'state': 'FALSE_F',
  141. 'body': ['END', 'FALSE_A'],
  142. 'flag': ['010', '110'],
  143. 'eqcls': 'FALSE_F_EQCLS',
  144. },
  145. {
  146. 'state': 'FALSE_A',
  147. 'body': ['END', 'FALSE_L'],
  148. 'flag': ['010', '110'],
  149. 'eqcls': 'FALSE_A_EQCLS',
  150. },
  151. {
  152. 'state': 'FALSE_L',
  153. 'body': ['END', 'FALSE_S'],
  154. 'flag': ['010', '110'],
  155. 'eqcls': 'FALSE_L_EQCLS',
  156. },
  157. {
  158. 'state': 'FALSE_S',
  159. 'body': ['END', 'ENT'],
  160. 'flag': ['010', '101'],
  161. 'eqcls': 'FALSE_S_EQCLS',
  162. },
  163. {
  164. 'state': 'NULL_N',
  165. 'body': ['END', 'NULL_U'],
  166. 'flag': ['010', '110'],
  167. 'eqcls': 'NULL_N_EQCLS',
  168. },
  169. {
  170. 'state': 'NULL_U',
  171. 'body': ['END', 'NULL_L'],
  172. 'flag': ['010', '110'],
  173. 'eqcls': 'NULL_U_EQCLS',
  174. },
  175. {
  176. 'state': 'NULL_L',
  177. 'body': ['END', 'ENT'],
  178. 'flag': ['010', '101'],
  179. 'eqcls': 'NULL_U_EQCLS',
  180. }
  181. ]
  182.  
  183.  
  184. # equal class 에 shift 추가 (32비트에 순서대로 자신의 비트수만큼 점유)
  185. def init_shift_equal_class():
  186. cnt = 0
  187. for k, v in equal_class.items():
  188. v['shift'] = cnt
  189. cnt += v['bits']
  190.  
  191. # 상태의 인덱스 MAP을 구함
  192. def gene_state_idx_map():
  193. ret = {}
  194. cnt = 0
  195. for itm in states:
  196. ret[itm['state']] = cnt
  197. cnt += len(itm['body'])
  198. return ret
  199.  
  200.  
  201.  
  202. init_shift_equal_class()
  203. idx_map = gene_state_idx_map()
  204.  
  205. print(idx_map)
  206.  
  207.  
  208. # equal class 를 구함 256개의 값 (ASCII)
  209. # 에 따라서 정해진 위치의 비트수만큼 equal class 를 구함
  210. def gene_eqcls():
  211. ret = []
  212. for c in range(256):
  213. ret.append('')
  214. for k, v in equal_class.items():
  215. if k != 'END_EQCLS':
  216. adder = '0' * v['bits']
  217. for i, itm in enumerate(v['body']):
  218. if chr(c) in itm:
  219. adder = bin(i)[2:].zfill(v['bits'])
  220. break
  221. ret[c] = adder + ret[c]
  222.  
  223. for i, itm in enumerate(ret):
  224. print (i, itm)
  225.  
  226. return ret
  227.  
  228.  
  229. #
  230. generated_eqcls = gene_eqcls()
  231.  
  232. # 상태 테이블 생성 (1차원 배열)
  233. # equal class 의 비트매스크를 정의하는 mask byte
  234. # equal class 의 Shift 숫자 를 저장한 shift byte
  235. # 상태에 따라 포인트증가, 토큰증가, 시작포인터증가 등을 제어하는 Flag byte
  236. # 상태의 숫자를 기록하는 state byte
  237. # 총 4바이트
  238. def gene_tbl():
  239. sep = ''
  240. tbl = []
  241. eq_map = {}
  242.  
  243. for state in states:
  244. eq_map[state['state']] = state['eqcls']
  245.  
  246. for row, state in enumerate(states):
  247. for i, itm in enumerate(state['body']):
  248.  
  249. # eqcls byte
  250. ## shift
  251. tar = equal_class[eq_map[itm]]
  252. #tar = equal_class[state['eqcls']]
  253. shift_byte = bin(tar['shift'])[2:].zfill(8)
  254. ## mask
  255. mask_byte = ('1' * tar['bits']).zfill(8)
  256.  
  257. # fail bits + flag bit = flag tyes
  258. flag_byte = bin(row)[2:].zfill(5) + state['flag'][i]
  259.  
  260. # state byte
  261. state_byte = bin(idx_map[itm])[2:].zfill(8)
  262. tbl.append(
  263. mask_byte + sep +
  264. shift_byte + sep +
  265. flag_byte + sep +
  266. state_byte
  267. )
  268.  
  269. print(tbl)
  270.  
  271. return tbl
  272.  
  273.  
  274. generated_tbl = gene_tbl()
  275.  
  276. ##### simulation table logic
  277.  
  278. def flag_inc(state, shift):
  279. st = int(state,2)
  280. r = st >> shift
  281. r = r & 0x1
  282. return r
  283.  
  284.  
  285. def str_inc(state, l):
  286. flag = flag_inc(state, 9)
  287. mask = int('1' * 32, 2)
  288. mask = bin(mask + flag)[2:]
  289. if len(mask) > 32:
  290. mask = mask[len(mask)-32:]
  291. mask = int(mask, 2)
  292. return l & mask
  293.  
  294. def get_cls(cls, state):
  295. c = int(cls,2)
  296. st = int(state,2)
  297. shift = (st&0xFF0000)>>16
  298. mask = st>>24
  299. return (c>>shift)&mask
  300.  
  301. def get_state(state):
  302. st = int(state,2)
  303. return st & 0xff
  304.  
  305. def get_char(p, txt):
  306. if p >= len(txt):
  307. return 0
  308. else:
  309. return ord(txt[p])
  310.  
  311.  
  312.  
  313. def get_fail_flag(state):
  314. st = int(state,2)
  315. return (st & 0xf800) >> 11
  316.  
  317.  
  318. def get_state_nm(idx):
  319. for k, v in idx_map.items():
  320. if v == idx:
  321. return k
  322. return ''
  323.  
  324. # C언어와 동일한 로직을 구현하여 동작여부 확인
  325. def simul_jnjson(eqcls, tbl, txt):
  326. print('start lexing:', txt)
  327. p = 0
  328. s = 0
  329. t_idx = 0
  330. t_s = s
  331. t_len = 0
  332. # start ,shift ,flags ,state ,
  333. state = '00000111000000000000001000000001'
  334.  
  335. while True: # do{ } while();
  336. p += flag_inc(state, 10)
  337. t_s = s
  338. t_len = p - s
  339. t_idx += flag_inc(state, 8)
  340. s += str_inc(state, p-s)
  341.  
  342. cls = eqcls[get_char(p, txt)]
  343. cls = get_cls(cls, state)
  344. idx = get_state(state) + cls
  345. state = tbl[idx]
  346. print('p[%s] : t[%s] .s=%s, .len=%d , %s, cls:%s nxt:%s, idx:%s %s' % (
  347. chr(get_char(p,txt)),
  348. t_idx,
  349. txt[t_s],
  350. t_len,
  351. eqcls[get_char(p, txt)],
  352. cls,
  353. state,
  354. idx,
  355. get_state_nm(get_state(state)),
  356. )
  357. )
  358.  
  359. if get_state(state) > 0:
  360. pass
  361. else:
  362. break
  363.  
  364. fail_row = get_fail_flag(state)
  365.  
  366. if fail_row <= 1 and get_char(p, txt) == 0:
  367. print('DONE')
  368. else:
  369. print('TOKEN ERROR:', fail_row, state)
  370.  
  371. def test_cases():
  372. cs = [
  373. '{}[ ]:\t, ', # entry default
  374. '[]:;', # entry error
  375. '"hello world\\r\\n\\""', # string
  376. '{}:,"hell\\r\\n\\""[,,,]', # string
  377. '"hell', # string err
  378. '"\\uabcd"', # hex
  379. '0', # num
  380. '-1', # num
  381. '-12.234', # num
  382. '-0.320E+12', # num
  383. 'false',
  384. 'true',
  385. 'null',
  386. 'fa:,[]', # err
  387. '[]nu"ll', # err
  388. ]
  389. for c in cs:
  390. simul_jnjson(generated_eqcls, generated_tbl, c)
  391.  
  392.  
  393. test_cases()
  394.  
  395.  
  396.  
  397. ### generated source
  398.  
  399. def gen_c_src(eqcls, tbl):
  400. eqcls_arr = 'int eqcls[256] = {\n'
  401. for i, cls in enumerate(eqcls):
  402. eqcls_arr += '%10s, '%(hex(int(cls,2)))
  403. if (i + 1) % 8 == 0:
  404. eqcls_arr += '\n'
  405. eqcls_arr += '};\n'
  406.  
  407. print(eqcls_arr)
  408.  
  409. tbl_arr = 'int tbl[] = {\n'
  410. for i, t in enumerate(tbl):
  411. tbl_arr += '%10s, '%(hex(int(t,2)))
  412. if (i + 1) % 8 == 0:
  413. tbl_arr += '\n'
  414. tbl_arr += '};\n'
  415.  
  416. print(tbl_arr)
  417.  
  418. print('//start =', hex(int('00000111000000000000001000000001',2)))
  419.  
  420. main_src = '''
  421. char* p = in_buf;
  422. char* s = in_buf;
  423. jn_str_t* t = out_toks;
  424. int state = 0x7000201;
  425. unsigned int cls = 0;
  426. do
  427. {
  428. p += (state>>10) & 0x1;
  429. t->s = s;
  430. t->len = p - s;
  431. t += (state>>8) & 0x1;
  432. s += (p - s) & (UINT_MAX + ((state>>9) & 0x1));
  433. cls = eqcls[(unsigned char)(*p)];
  434. cls = (cls>>((state & 0x00FF0000)>>16))&(state>>24);
  435. state = tbl[ (state & 0x000000FF) + cls ];
  436. }
  437. while( (state & 0x000000FF) > 0);
  438. '''
  439.  
  440. print(main_src)
  441.  
  442. gen_c_src(generated_eqcls, generated_tbl)
Success #stdin #stdout 0.02s 9328KB
stdin
Standard input is empty
stdout
{'END': 0, 'ENT': 1, 'STR': 9, 'ESC': 13, 'HEX': 16, 'HEX1': 18, 'HEX2': 20, 'HEX3': 22, 'NUM': 24, 'MINUS': 28, 'ZERO': 32, 'ONENINE': 36, 'FRAC_S': 40, 'FRAC_O': 44, 'EXP_S': 48, 'EXP_O': 51, 'TRUE_T': 54, 'TRUE_R': 56, 'TRUE_U': 58, 'FALSE_F': 60, 'FALSE_A': 62, 'FALSE_L': 64, 'FALSE_S': 66, 'NULL_N': 68, 'NULL_U': 70, 'NULL_L': 72}
0 00000000000000000001000
1 00000000000000000000000
2 00000000000000000000000
3 00000000000000000000000
4 00000000000000000000000
5 00000000000000000000000
6 00000000000000000000000
7 00000000000000000000000
8 00000000000000000000000
9 00000000000000000000010
10 00000000000000000000010
11 00000000000000000000000
12 00000000000000000000000
13 00000000000000000000010
14 00000000000000000000000
15 00000000000000000000000
16 00000000000000000000000
17 00000000000000000000000
18 00000000000000000000000
19 00000000000000000000000
20 00000000000000000000000
21 00000000000000000000000
22 00000000000000000000000
23 00000000000000000000000
24 00000000000000000000000
25 00000000000000000000000
26 00000000000000000000000
27 00000000000000000000000
28 00000000000000000000000
29 00000000000000000000000
30 00000000000000000000000
31 00000000000000000000000
32 00000000000000000000010
33 00000000000000000000000
34 00000000000000000110011
35 00000000000000000000000
36 00000000000000000000000
37 00000000000000000000000
38 00000000000000000000000
39 00000000000000000000000
40 00000000000000000000000
41 00000000000000000000000
42 00000000000000000000000
43 00000000001000000000000
44 00000000000000000000001
45 00000000001000100000100
46 00000000000010000000000
47 00000000000000000100000
48 00000000010111010000100
49 00000000010111110000100
50 00000000010111110000100
51 00000000010111110000100
52 00000000010111110000100
53 00000000010111110000100
54 00000000010111110000100
55 00000000010111110000100
56 00000000010111110000100
57 00000000010111110000100
58 00000000000000000000001
59 00000000000000000000000
60 00000000000000000000000
61 00000000000000000000000
62 00000000000000000000000
63 00000000000000000000000
64 00000000000000000000000
65 00000000000000010000000
66 00000000000000010000000
67 00000000000000010000000
68 00000000000000010000000
69 00000000000100010000000
70 00000000000000010000000
71 00000000000000000000000
72 00000000000000000000000
73 00000000000000000000000
74 00000000000000000000000
75 00000000000000000000000
76 00000000000000000000000
77 00000000000000000000000
78 00000000000000000000000
79 00000000000000000000000
80 00000000000000000000000
81 00000000000000000000000
82 00000000000000000000000
83 00000000000000000000000
84 00000000000000000000000
85 00000000000000000000000
86 00000000000000000000000
87 00000000000000000000000
88 00000000000000000000000
89 00000000000000000000000
90 00000000000000000000000
91 00000000000000000000001
92 00000000000000000111000
93 00000000000000000000001
94 00000000000000000000000
95 00000000000000000000000
96 00000000000000000000000
97 00000100000000010000000
98 00000000000000010100000
99 00000000000000010000000
100 00000000000000010000000
101 00100010000100010000000
102 00000000000000010100110
103 00000000000000000000000
104 00000000000000000000000
105 00000000000000000000000
106 00000000000000000000000
107 00000000000000000000000
108 10001000000000000000000
109 00000000000000000000000
110 00000000000000000100111
111 00000000000000000000000
112 00000000000000000000000
113 00000000000000000000000
114 00000000100000000100000
115 00010000000000000000000
116 00000000000000000100101
117 01000001000000001000000
118 00000000000000000000000
119 00000000000000000000000
120 00000000000000000000000
121 00000000000000000000000
122 00000000000000000000000
123 00000000000000000000001
124 00000000000000000000000
125 00000000000000000000001
126 00000000000000000000000
127 00000000000000000000000
128 00000000000000000000000
129 00000000000000000000000
130 00000000000000000000000
131 00000000000000000000000
132 00000000000000000000000
133 00000000000000000000000
134 00000000000000000000000
135 00000000000000000000000
136 00000000000000000000000
137 00000000000000000000000
138 00000000000000000000000
139 00000000000000000000000
140 00000000000000000000000
141 00000000000000000000000
142 00000000000000000000000
143 00000000000000000000000
144 00000000000000000000000
145 00000000000000000000000
146 00000000000000000000000
147 00000000000000000000000
148 00000000000000000000000
149 00000000000000000000000
150 00000000000000000000000
151 00000000000000000000000
152 00000000000000000000000
153 00000000000000000000000
154 00000000000000000000000
155 00000000000000000000000
156 00000000000000000000000
157 00000000000000000000000
158 00000000000000000000000
159 00000000000000000000000
160 00000000000000000000000
161 00000000000000000000000
162 00000000000000000000000
163 00000000000000000000000
164 00000000000000000000000
165 00000000000000000000000
166 00000000000000000000000
167 00000000000000000000000
168 00000000000000000000000
169 00000000000000000000000
170 00000000000000000000000
171 00000000000000000000000
172 00000000000000000000000
173 00000000000000000000000
174 00000000000000000000000
175 00000000000000000000000
176 00000000000000000000000
177 00000000000000000000000
178 00000000000000000000000
179 00000000000000000000000
180 00000000000000000000000
181 00000000000000000000000
182 00000000000000000000000
183 00000000000000000000000
184 00000000000000000000000
185 00000000000000000000000
186 00000000000000000000000
187 00000000000000000000000
188 00000000000000000000000
189 00000000000000000000000
190 00000000000000000000000
191 00000000000000000000000
192 00000000000000000000000
193 00000000000000000000000
194 00000000000000000000000
195 00000000000000000000000
196 00000000000000000000000
197 00000000000000000000000
198 00000000000000000000000
199 00000000000000000000000
200 00000000000000000000000
201 00000000000000000000000
202 00000000000000000000000
203 00000000000000000000000
204 00000000000000000000000
205 00000000000000000000000
206 00000000000000000000000
207 00000000000000000000000
208 00000000000000000000000
209 00000000000000000000000
210 00000000000000000000000
211 00000000000000000000000
212 00000000000000000000000
213 00000000000000000000000
214 00000000000000000000000
215 00000000000000000000000
216 00000000000000000000000
217 00000000000000000000000
218 00000000000000000000000
219 00000000000000000000000
220 00000000000000000000000
221 00000000000000000000000
222 00000000000000000000000
223 00000000000000000000000
224 00000000000000000000000
225 00000000000000000000000
226 00000000000000000000000
227 00000000000000000000000
228 00000000000000000000000
229 00000000000000000000000
230 00000000000000000000000
231 00000000000000000000000
232 00000000000000000000000
233 00000000000000000000000
234 00000000000000000000000
235 00000000000000000000000
236 00000000000000000000000
237 00000000000000000000000
238 00000000000000000000000
239 00000000000000000000000
240 00000000000000000000000
241 00000000000000000000000
242 00000000000000000000000
243 00000000000000000000000
244 00000000000000000000000
245 00000000000000000000000
246 00000000000000000000000
247 00000000000000000000000
248 00000000000000000000000
249 00000000000000000000000
250 00000000000000000000000
251 00000000000000000000000
252 00000000000000000000000
253 00000000000000000000000
254 00000000000000000000000
255 00000000000000000000000
['00000000000000000000001000000000', '00000000000000000000101000000000', '00000111000000000000110100000001', '00000111000000000000110000000001', '00000011000000110000111000001001', '00000011000010000000101000011000', '00000001000011100000111000110110', '00000001000100010000111000111100', '00000001000101010000111001000100', '00000011000000110001011000001001', '00000000000000000001001000000000', '00000111000000000001010100000001', '00000011000001010001011000001101', '00000000000000000001101000000000', '00000011000000110001111000001001', '00000001000001110001111000010000', '00000000000000000010001000000000', '00000001000001110010011000010010', '00000000000000000010101000000000', '00000001000001110010111000010100', '00000000000000000011001000000000', '00000001000001110011011000010110', '00000000000000000011101000000000', '00000011000000110011111000001001', '00000000000000000100001000000000', '00000011000010000100011000011100', '00000011000010000100011000100000', '00000011000010000100011000100100', '00000000000000000100101000000000', '00000000000000000100101000000000', '00000011000010000100111000100000', '00000011000010000100111000100100', '00000011000010100101001000101000', '00000000000000000101001000000000', '00000000000000000101001000000000', '00000000000000000101001000000000', '00000011000010100101101000101000', '00000000000000000101101000000000', '00000011000010000101111000100100', '00000011000010000101111000100100', '00000111000000000110000100000001', '00000011000010100110011000101100', '00000011000011000110011000110000', '00000000000000000110001000000000', '00000111000000000110100100000001', '00000000000000000110101000000000', '00000011000011000110111000110000', '00000011000010100110111000101100', '00000000000000000111001000000000', '00000011000011000111011000110011', '00000011000011000111011000110011', '00000111000000000111100100000001', '00000000000000000111101000000000', '00000011000011000111111000110011', '00000000000000001000001000000000', '00000001000011111000011000111000', '00000000000000001000101000000000', '00000001000100001000111000111010', '00000000000000001001001000000000', '00000111000000001001010100000001', '00000000000000001001101000000000', '00000001000100101001111000111110', '00000000000000001010001000000000', '00000001000100111010011001000000', '00000000000000001010101000000000', '00000001000101001010111001000010', '00000000000000001011001000000000', '00000111000000001011010100000001', '00000000000000001011101000000000', '00000001000101101011111001000110', '00000000000000001100001000000000', '00000001000101101100011001001000', '00000000000000001100101000000000', '00000111000000001100110100000001']
start lexing: {}[ ]:	, 
p[{] : t[0] .s={, .len=0 , 00000000000000000000001, cls:1 nxt:00000111000000000000110100000001, idx:2 ENT
p[}] : t[1] .s={, .len=1 , 00000000000000000000001, cls:1 nxt:00000111000000000000110100000001, idx:2 ENT
p[[] : t[2] .s=}, .len=1 , 00000000000000000000001, cls:1 nxt:00000111000000000000110100000001, idx:2 ENT
p[ ] : t[3] .s=[, .len=1 , 00000000000000000000010, cls:2 nxt:00000111000000000000110000000001, idx:3 ENT
p[]] : t[3] .s= , .len=1 , 00000000000000000000001, cls:1 nxt:00000111000000000000110100000001, idx:2 ENT
p[:] : t[4] .s=], .len=1 , 00000000000000000000001, cls:1 nxt:00000111000000000000110100000001, idx:2 ENT
p[	] : t[5] .s=:, .len=1 , 00000000000000000000010, cls:2 nxt:00000111000000000000110000000001, idx:3 ENT
p[,] : t[5] .s=	, .len=1 , 00000000000000000000001, cls:1 nxt:00000111000000000000110100000001, idx:2 ENT
p[ ] : t[6] .s=,, .len=1 , 00000000000000000000010, cls:2 nxt:00000111000000000000110000000001, idx:3 ENT
p[] : t[6] .s= , .len=1 , 00000000000000000001000, cls:0 nxt:00000000000000000000101000000000, idx:1 END
DONE
start lexing: []:;
p[[] : t[0] .s=[, .len=0 , 00000000000000000000001, cls:1 nxt:00000111000000000000110100000001, idx:2 ENT
p[]] : t[1] .s=[, .len=1 , 00000000000000000000001, cls:1 nxt:00000111000000000000110100000001, idx:2 ENT
p[:] : t[2] .s=], .len=1 , 00000000000000000000001, cls:1 nxt:00000111000000000000110100000001, idx:2 ENT
p[;] : t[3] .s=:, .len=1 , 00000000000000000000000, cls:0 nxt:00000000000000000000101000000000, idx:1 END
TOKEN ERROR: 1 00000000000000000000101000000000
start lexing: "hello world\r\n\""
p["] : t[0] .s=", .len=0 , 00000000000000000110011, cls:3 nxt:00000011000000110000111000001001, idx:4 STR
p[h] : t[0] .s=", .len=1 , 00000000000000000000000, cls:0 nxt:00000011000000110001011000001001, idx:9 STR
p[e] : t[0] .s=", .len=2 , 00100010000100010000000, cls:0 nxt:00000011000000110001011000001001, idx:9 STR
p[l] : t[0] .s=", .len=3 , 10001000000000000000000, cls:0 nxt:00000011000000110001011000001001, idx:9 STR
p[l] : t[0] .s=", .len=4 , 10001000000000000000000, cls:0 nxt:00000011000000110001011000001001, idx:9 STR
p[o] : t[0] .s=", .len=5 , 00000000000000000000000, cls:0 nxt:00000011000000110001011000001001, idx:9 STR
p[ ] : t[0] .s=", .len=6 , 00000000000000000000010, cls:0 nxt:00000011000000110001011000001001, idx:9 STR
p[w] : t[0] .s=", .len=7 , 00000000000000000000000, cls:0 nxt:00000011000000110001011000001001, idx:9 STR
p[o] : t[0] .s=", .len=8 , 00000000000000000000000, cls:0 nxt:00000011000000110001011000001001, idx:9 STR
p[r] : t[0] .s=", .len=9 , 00000000100000000100000, cls:0 nxt:00000011000000110001011000001001, idx:9 STR
p[l] : t[0] .s=", .len=10 , 10001000000000000000000, cls:0 nxt:00000011000000110001011000001001, idx:9 STR
p[d] : t[0] .s=", .len=11 , 00000000000000010000000, cls:0 nxt:00000011000000110001011000001001, idx:9 STR
p[\] : t[0] .s=", .len=12 , 00000000000000000111000, cls:3 nxt:00000011000001010001011000001101, idx:12 ESC
p[r] : t[0] .s=", .len=13 , 00000000100000000100000, cls:1 nxt:00000011000000110001111000001001, idx:14 STR
p[\] : t[0] .s=", .len=14 , 00000000000000000111000, cls:3 nxt:00000011000001010001011000001101, idx:12 ESC
p[n] : t[0] .s=", .len=15 , 00000000000000000100111, cls:1 nxt:00000011000000110001111000001001, idx:14 STR
p[\] : t[0] .s=", .len=16 , 00000000000000000111000, cls:3 nxt:00000011000001010001011000001101, idx:12 ESC
p["] : t[0] .s=", .len=17 , 00000000000000000110011, cls:1 nxt:00000011000000110001111000001001, idx:14 STR
p["] : t[0] .s=", .len=18 , 00000000000000000110011, cls:2 nxt:00000111000000000001010100000001, idx:11 ENT
p[] : t[1] .s=", .len=19 , 00000000000000000001000, cls:0 nxt:00000000000000000000101000000000, idx:1 END
DONE
start lexing: {}:,"hell\r\n\""[,,,]
p[{] : t[0] .s={, .len=0 , 00000000000000000000001, cls:1 nxt:00000111000000000000110100000001, idx:2 ENT
p[}] : t[1] .s={, .len=1 , 00000000000000000000001, cls:1 nxt:00000111000000000000110100000001, idx:2 ENT
p[:] : t[2] .s=}, .len=1 , 00000000000000000000001, cls:1 nxt:00000111000000000000110100000001, idx:2 ENT
p[,] : t[3] .s=:, .len=1 , 00000000000000000000001, cls:1 nxt:00000111000000000000110100000001, idx:2 ENT
p["] : t[4] .s=,, .len=1 , 00000000000000000110011, cls:3 nxt:00000011000000110000111000001001, idx:4 STR
p[h] : t[4] .s=", .len=1 , 00000000000000000000000, cls:0 nxt:00000011000000110001011000001001, idx:9 STR
p[e] : t[4] .s=", .len=2 , 00100010000100010000000, cls:0 nxt:00000011000000110001011000001001, idx:9 STR
p[l] : t[4] .s=", .len=3 , 10001000000000000000000, cls:0 nxt:00000011000000110001011000001001, idx:9 STR
p[l] : t[4] .s=", .len=4 , 10001000000000000000000, cls:0 nxt:00000011000000110001011000001001, idx:9 STR
p[\] : t[4] .s=", .len=5 , 00000000000000000111000, cls:3 nxt:00000011000001010001011000001101, idx:12 ESC
p[r] : t[4] .s=", .len=6 , 00000000100000000100000, cls:1 nxt:00000011000000110001111000001001, idx:14 STR
p[\] : t[4] .s=", .len=7 , 00000000000000000111000, cls:3 nxt:00000011000001010001011000001101, idx:12 ESC
p[n] : t[4] .s=", .len=8 , 00000000000000000100111, cls:1 nxt:00000011000000110001111000001001, idx:14 STR
p[\] : t[4] .s=", .len=9 , 00000000000000000111000, cls:3 nxt:00000011000001010001011000001101, idx:12 ESC
p["] : t[4] .s=", .len=10 , 00000000000000000110011, cls:1 nxt:00000011000000110001111000001001, idx:14 STR
p["] : t[4] .s=", .len=11 , 00000000000000000110011, cls:2 nxt:00000111000000000001010100000001, idx:11 ENT
p[[] : t[5] .s=", .len=12 , 00000000000000000000001, cls:1 nxt:00000111000000000000110100000001, idx:2 ENT
p[,] : t[6] .s=[, .len=1 , 00000000000000000000001, cls:1 nxt:00000111000000000000110100000001, idx:2 ENT
p[,] : t[7] .s=,, .len=1 , 00000000000000000000001, cls:1 nxt:00000111000000000000110100000001, idx:2 ENT
p[,] : t[8] .s=,, .len=1 , 00000000000000000000001, cls:1 nxt:00000111000000000000110100000001, idx:2 ENT
p[]] : t[9] .s=,, .len=1 , 00000000000000000000001, cls:1 nxt:00000111000000000000110100000001, idx:2 ENT
p[] : t[10] .s=], .len=1 , 00000000000000000001000, cls:0 nxt:00000000000000000000101000000000, idx:1 END
DONE
start lexing: "hell
p["] : t[0] .s=", .len=0 , 00000000000000000110011, cls:3 nxt:00000011000000110000111000001001, idx:4 STR
p[h] : t[0] .s=", .len=1 , 00000000000000000000000, cls:0 nxt:00000011000000110001011000001001, idx:9 STR
p[e] : t[0] .s=", .len=2 , 00100010000100010000000, cls:0 nxt:00000011000000110001011000001001, idx:9 STR
p[l] : t[0] .s=", .len=3 , 10001000000000000000000, cls:0 nxt:00000011000000110001011000001001, idx:9 STR
p[l] : t[0] .s=", .len=4 , 10001000000000000000000, cls:0 nxt:00000011000000110001011000001001, idx:9 STR
p[] : t[0] .s=", .len=5 , 00000000000000000001000, cls:1 nxt:00000000000000000001001000000000, idx:10 END
TOKEN ERROR: 2 00000000000000000001001000000000
start lexing: "\uabcd"
p["] : t[0] .s=", .len=0 , 00000000000000000110011, cls:3 nxt:00000011000000110000111000001001, idx:4 STR
p[\] : t[0] .s=", .len=1 , 00000000000000000111000, cls:3 nxt:00000011000001010001011000001101, idx:12 ESC
p[u] : t[0] .s=", .len=2 , 01000001000000001000000, cls:2 nxt:00000001000001110001111000010000, idx:15 HEX
p[a] : t[0] .s=", .len=3 , 00000100000000010000000, cls:1 nxt:00000001000001110010011000010010, idx:17 HEX1
p[b] : t[0] .s=", .len=4 , 00000000000000010100000, cls:1 nxt:00000001000001110010111000010100, idx:19 HEX2
p[c] : t[0] .s=", .len=5 , 00000000000000010000000, cls:1 nxt:00000001000001110011011000010110, idx:21 HEX3
p[d] : t[0] .s=", .len=6 , 00000000000000010000000, cls:1 nxt:00000011000000110011111000001001, idx:23 STR
p["] : t[0] .s=", .len=7 , 00000000000000000110011, cls:2 nxt:00000111000000000001010100000001, idx:11 ENT
p[] : t[1] .s=", .len=8 , 00000000000000000001000, cls:0 nxt:00000000000000000000101000000000, idx:1 END
DONE
start lexing: 0
p[0] : t[0] .s=0, .len=0 , 00000000010111010000100, cls:4 nxt:00000011000010000000101000011000, idx:5 NUM
p[0] : t[0] .s=0, .len=0 , 00000000010111010000100, cls:2 nxt:00000011000010000100011000100000, idx:26 ZERO
p[] : t[0] .s=0, .len=1 , 00000000000000000001000, cls:0 nxt:00000011000010100101001000101000, idx:32 FRAC_S
p[] : t[0] .s=0, .len=1 , 00000000000000000001000, cls:0 nxt:00000111000000000110000100000001, idx:40 ENT
p[] : t[1] .s=0, .len=1 , 00000000000000000001000, cls:0 nxt:00000000000000000000101000000000, idx:1 END
DONE
start lexing: -1
p[-] : t[0] .s=-, .len=0 , 00000000001000100000100, cls:4 nxt:00000011000010000000101000011000, idx:5 NUM
p[-] : t[0] .s=-, .len=0 , 00000000001000100000100, cls:1 nxt:00000011000010000100011000011100, idx:25 MINUS
p[1] : t[0] .s=-, .len=1 , 00000000010111110000100, cls:3 nxt:00000011000010000100111000100100, idx:31 ONENINE
p[] : t[0] .s=-, .len=2 , 00000000000000000001000, cls:0 nxt:00000011000010100101101000101000, idx:36 FRAC_S
p[] : t[0] .s=-, .len=2 , 00000000000000000001000, cls:0 nxt:00000111000000000110000100000001, idx:40 ENT
p[] : t[1] .s=-, .len=2 , 00000000000000000001000, cls:0 nxt:00000000000000000000101000000000, idx:1 END
DONE
start lexing: -12.234
p[-] : t[0] .s=-, .len=0 , 00000000001000100000100, cls:4 nxt:00000011000010000000101000011000, idx:5 NUM
p[-] : t[0] .s=-, .len=0 , 00000000001000100000100, cls:1 nxt:00000011000010000100011000011100, idx:25 MINUS
p[1] : t[0] .s=-, .len=1 , 00000000010111110000100, cls:3 nxt:00000011000010000100111000100100, idx:31 ONENINE
p[2] : t[0] .s=-, .len=2 , 00000000010111110000100, cls:3 nxt:00000011000010000101111000100100, idx:39 ONENINE
p[.] : t[0] .s=-, .len=3 , 00000000000010000000000, cls:0 nxt:00000011000010100101101000101000, idx:36 FRAC_S
p[.] : t[0] .s=-, .len=3 , 00000000000010000000000, cls:1 nxt:00000011000010100110011000101100, idx:41 FRAC_O
p[2] : t[0] .s=-, .len=4 , 00000000010111110000100, cls:3 nxt:00000011000010100110111000101100, idx:47 FRAC_O
p[3] : t[0] .s=-, .len=5 , 00000000010111110000100, cls:3 nxt:00000011000010100110111000101100, idx:47 FRAC_O
p[4] : t[0] .s=-, .len=6 , 00000000010111110000100, cls:3 nxt:00000011000010100110111000101100, idx:47 FRAC_O
p[] : t[0] .s=-, .len=7 , 00000000000000000001000, cls:0 nxt:00000111000000000110100100000001, idx:44 ENT
p[] : t[1] .s=-, .len=7 , 00000000000000000001000, cls:0 nxt:00000000000000000000101000000000, idx:1 END
DONE
start lexing: -0.320E+12
p[-] : t[0] .s=-, .len=0 , 00000000001000100000100, cls:4 nxt:00000011000010000000101000011000, idx:5 NUM
p[-] : t[0] .s=-, .len=0 , 00000000001000100000100, cls:1 nxt:00000011000010000100011000011100, idx:25 MINUS
p[0] : t[0] .s=-, .len=1 , 00000000010111010000100, cls:2 nxt:00000011000010000100111000100000, idx:30 ZERO
p[.] : t[0] .s=-, .len=2 , 00000000000010000000000, cls:0 nxt:00000011000010100101001000101000, idx:32 FRAC_S
p[.] : t[0] .s=-, .len=2 , 00000000000010000000000, cls:1 nxt:00000011000010100110011000101100, idx:41 FRAC_O
p[3] : t[0] .s=-, .len=3 , 00000000010111110000100, cls:3 nxt:00000011000010100110111000101100, idx:47 FRAC_O
p[2] : t[0] .s=-, .len=4 , 00000000010111110000100, cls:3 nxt:00000011000010100110111000101100, idx:47 FRAC_O
p[0] : t[0] .s=-, .len=5 , 00000000010111010000100, cls:3 nxt:00000011000010100110111000101100, idx:47 FRAC_O
p[E] : t[0] .s=-, .len=6 , 00000000000100010000000, cls:2 nxt:00000011000011000110111000110000, idx:46 EXP_S
p[+] : t[0] .s=-, .len=7 , 00000000001000000000000, cls:1 nxt:00000011000011000111011000110011, idx:49 EXP_O
p[1] : t[0] .s=-, .len=8 , 00000000010111110000100, cls:2 nxt:00000011000011000111111000110011, idx:53 EXP_O
p[2] : t[0] .s=-, .len=9 , 00000000010111110000100, cls:2 nxt:00000011000011000111111000110011, idx:53 EXP_O
p[] : t[0] .s=-, .len=10 , 00000000000000000001000, cls:0 nxt:00000111000000000111100100000001, idx:51 ENT
p[] : t[1] .s=-, .len=10 , 00000000000000000001000, cls:0 nxt:00000000000000000000101000000000, idx:1 END
DONE
start lexing: false
p[f] : t[0] .s=f, .len=0 , 00000000000000010100110, cls:6 nxt:00000001000100010000111000111100, idx:7 FALSE_F
p[a] : t[0] .s=f, .len=1 , 00000100000000010000000, cls:1 nxt:00000001000100101001111000111110, idx:61 FALSE_A
p[l] : t[0] .s=f, .len=2 , 10001000000000000000000, cls:1 nxt:00000001000100111010011001000000, idx:63 FALSE_L
p[s] : t[0] .s=f, .len=3 , 00010000000000000000000, cls:1 nxt:00000001000101001010111001000010, idx:65 FALSE_S
p[e] : t[0] .s=f, .len=4 , 00100010000100010000000, cls:1 nxt:00000111000000001011010100000001, idx:67 ENT
p[] : t[1] .s=f, .len=5 , 00000000000000000001000, cls:0 nxt:00000000000000000000101000000000, idx:1 END
DONE
start lexing: true
p[t] : t[0] .s=t, .len=0 , 00000000000000000100101, cls:5 nxt:00000001000011100000111000110110, idx:6 TRUE_T
p[r] : t[0] .s=t, .len=1 , 00000000100000000100000, cls:1 nxt:00000001000011111000011000111000, idx:55 TRUE_R
p[u] : t[0] .s=t, .len=2 , 01000001000000001000000, cls:1 nxt:00000001000100001000111000111010, idx:57 TRUE_U
p[e] : t[0] .s=t, .len=3 , 00100010000100010000000, cls:1 nxt:00000111000000001001010100000001, idx:59 ENT
p[] : t[1] .s=t, .len=4 , 00000000000000000001000, cls:0 nxt:00000000000000000000101000000000, idx:1 END
DONE
start lexing: null
p[n] : t[0] .s=n, .len=0 , 00000000000000000100111, cls:7 nxt:00000001000101010000111001000100, idx:8 NULL_N
p[u] : t[0] .s=n, .len=1 , 01000001000000001000000, cls:1 nxt:00000001000101101011111001000110, idx:69 NULL_U
p[l] : t[0] .s=n, .len=2 , 10001000000000000000000, cls:1 nxt:00000001000101101100011001001000, idx:71 NULL_L
p[l] : t[0] .s=n, .len=3 , 10001000000000000000000, cls:1 nxt:00000111000000001100110100000001, idx:73 ENT
p[] : t[1] .s=n, .len=4 , 00000000000000000001000, cls:0 nxt:00000000000000000000101000000000, idx:1 END
DONE
start lexing: fa:,[]
p[f] : t[0] .s=f, .len=0 , 00000000000000010100110, cls:6 nxt:00000001000100010000111000111100, idx:7 FALSE_F
p[a] : t[0] .s=f, .len=1 , 00000100000000010000000, cls:1 nxt:00000001000100101001111000111110, idx:61 FALSE_A
p[:] : t[0] .s=f, .len=2 , 00000000000000000000001, cls:0 nxt:00000000000000001010001000000000, idx:62 END
TOKEN ERROR: 20 00000000000000001010001000000000
start lexing: []nu"ll
p[[] : t[0] .s=[, .len=0 , 00000000000000000000001, cls:1 nxt:00000111000000000000110100000001, idx:2 ENT
p[]] : t[1] .s=[, .len=1 , 00000000000000000000001, cls:1 nxt:00000111000000000000110100000001, idx:2 ENT
p[n] : t[2] .s=], .len=1 , 00000000000000000100111, cls:7 nxt:00000001000101010000111001000100, idx:8 NULL_N
p[u] : t[2] .s=n, .len=1 , 01000001000000001000000, cls:1 nxt:00000001000101101011111001000110, idx:69 NULL_U
p["] : t[2] .s=n, .len=2 , 00000000000000000110011, cls:0 nxt:00000000000000001100001000000000, idx:70 END
TOKEN ERROR: 24 00000000000000001100001000000000
int eqcls[256] = {
       0x8,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0, 
       0x0,        0x2,        0x2,        0x0,        0x0,        0x2,        0x0,        0x0, 
       0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0, 
       0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0, 
       0x2,        0x0,       0x33,        0x0,        0x0,        0x0,        0x0,        0x0, 
       0x0,        0x0,        0x0,     0x1000,        0x1,     0x1104,      0x400,       0x20, 
    0x2e84,     0x2f84,     0x2f84,     0x2f84,     0x2f84,     0x2f84,     0x2f84,     0x2f84, 
    0x2f84,     0x2f84,        0x1,        0x0,        0x0,        0x0,        0x0,        0x0, 
       0x0,       0x80,       0x80,       0x80,       0x80,      0x880,       0x80,        0x0, 
       0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0, 
       0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0, 
       0x0,        0x0,        0x0,        0x1,       0x38,        0x1,        0x0,        0x0, 
       0x0,    0x20080,       0xa0,       0x80,       0x80,   0x110880,       0xa6,        0x0, 
       0x0,        0x0,        0x0,        0x0,   0x440000,        0x0,       0x27,        0x0, 
       0x0,        0x0,     0x4020,    0x80000,       0x25,   0x208040,        0x0,        0x0, 
       0x0,        0x0,        0x0,        0x1,        0x0,        0x1,        0x0,        0x0, 
       0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0, 
       0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0, 
       0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0, 
       0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0, 
       0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0, 
       0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0, 
       0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0, 
       0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0, 
       0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0, 
       0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0, 
       0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0, 
       0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0, 
       0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0, 
       0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0, 
       0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0, 
       0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0,        0x0, 
};

int tbl[] = {
     0x200,      0xa00,  0x7000d01,  0x7000c01,  0x3030e09,  0x3080a18,  0x10e0e36,  0x1110e3c, 
 0x1150e44,  0x3031609,     0x1200,  0x7001501,  0x305160d,     0x1a00,  0x3031e09,  0x1071e10, 
    0x2200,  0x1072612,     0x2a00,  0x1072e14,     0x3200,  0x1073616,     0x3a00,  0x3033e09, 
    0x4200,  0x308461c,  0x3084620,  0x3084624,     0x4a00,     0x4a00,  0x3084e20,  0x3084e24, 
 0x30a5228,     0x5200,     0x5200,     0x5200,  0x30a5a28,     0x5a00,  0x3085e24,  0x3085e24, 
 0x7006101,  0x30a662c,  0x30c6630,     0x6200,  0x7006901,     0x6a00,  0x30c6e30,  0x30a6e2c, 
    0x7200,  0x30c7633,  0x30c7633,  0x7007901,     0x7a00,  0x30c7e33,     0x8200,  0x10f8638, 
    0x8a00,  0x1108e3a,     0x9200,  0x7009501,     0x9a00,  0x1129e3e,     0xa200,  0x113a640, 
    0xaa00,  0x114ae42,     0xb200,  0x700b501,     0xba00,  0x116be46,     0xc200,  0x116c648, 
    0xca00,  0x700cd01, };

//start = 0x7000201

char* p = in_buf;
char* s = in_buf;
jn_str_t* t = out_toks;
int state = 0x7000201;
unsigned int cls = 0;
do
{
    p += (state>>10) & 0x1;
    t->s = s;
    t->len = p - s;
    t += (state>>8) & 0x1;
    s += (p - s) & (UINT_MAX + ((state>>9) & 0x1));
    cls = eqcls[(unsigned char)(*p)];
    cls = (cls>>((state & 0x00FF0000)>>16))&(state>>24);
	state = tbl[ (state & 0x000000FF) + cls ];
}
while( (state & 0x000000FF) > 0);