Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def main():
- stack = []
- state = 0x00
- ds = [] # data stack
- ss = [] # string stack
- es = [] # escape stack
- for ch in read_file("test.json").strip():
- cat = catcode[min(ord(ch), 0x7E)]
- state = parse_ch(cat, ch, stack, state, ds, ss, es)
- state = parse_ch(0, u'', stack, state, ds, ss, es)
- if state != 0x00:
- raise Exception("JSON decode error: truncated")
- if len(ds) != 1:
- raise Exception("JSON decode error: too many objects")
- val = ds.pop()
- print val
- def parse_ch(cat, ch, stack, state, ds, ss, es):
- while True:
- code = states[state][cat]
- action = code >> 8 & 0xFF
- code = code & 0xFF
- if action == 0xFF: # reduce
- if code == 0xFF:
- raise Exception("JSON decode error: syntax")
- state = stack.pop()
- action = code
- if action > 0:
- do_action(action, ch, ds, ss, es)
- else:
- if action >= 0x80: # shift
- stack.append(gotos[state])
- action -= 0x80
- if code != 0xFF: # nop
- state = code
- if action > 0:
- do_action(action, ch, ds, ss, es)
- break
- return state
- def do_action(action, ch, ds, ss, es):
- if action == 0x1:
- ds.append([])
- elif action == 0x2:
- ds.append({})
- elif action == 0x3:
- val = ds.pop()
- ds[len(ds)-1].append(val)
- elif action == 0x4:
- val = ds.pop()
- key = ds.pop()
- ds[len(ds)-1][key] = val
- elif action == 0x10:
- ds.append(None)
- elif action == 0x20:
- ds.append(True)
- elif action == 0x30:
- ds.append(False)
- elif action == 0x40:
- val = u"".join(ss)
- ds.append(val)
- ss[:] = []
- es[:] = []
- elif action == 0x50:
- val = int(u"".join(ss))
- ds.append(val)
- ss[:] = []
- elif action == 0x60:
- val = float(u"".join(ss))
- ds.append(val)
- ss[:] = []
- elif action == 0xA:
- ss.append(ch)
- elif action == 0xB:
- es.append(ch)
- elif action == 0xC:
- ss.append(unichr(escape_characters[ch]))
- elif action == 0xD:
- ss.append(unichr(int(u"".join(es), 16)))
- es[:] = []
- else:
- assert False, "JSON decoder bug"
- def read_file(filename):
- with open(filename, "rb") as fd:
- return fd.read().decode('utf-8''b': 8, 't': 9, 'n': 10, 'f': 12, 'r': 13}
- if __name__=="__main__":
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement