Advertisement
Guest User

Untitled

a guest
Aug 25th, 2016
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 13.19 KB | None | 0 0
  1. def main():
  2.     stack = []
  3.     state = 0x00
  4.     ds = [] # data stack
  5.     ss = [] # string stack
  6.     es = [] # escape stack
  7.     for ch in read_file("test.json").strip():
  8.         cat = catcode[min(ord(ch), 0x7E)]
  9.         state = parse_ch(cat, ch, stack, state, ds, ss, es)
  10.     state = parse_ch(0, u'', stack, state, ds, ss, es)
  11.     if state != 0x00:
  12.         raise Exception("JSON decode error: truncated")
  13.     if len(ds) != 1:
  14.         raise Exception("JSON decode error: too many objects")
  15.     val = ds.pop()
  16.     print val
  17.  
  18. def parse_ch(cat, ch, stack, state, ds, ss, es):
  19.     while True:
  20.         code = states[state][cat]
  21.         action = code >> 8 & 0xFF
  22.         code   = code      & 0xFF
  23.         if action == 0xFF: # reduce
  24.             if code == 0xFF:
  25.                 raise Exception("JSON decode error: syntax")
  26.             state = stack.pop()
  27.             action = code
  28.             if action > 0:
  29.                 do_action(action, ch, ds, ss, es)
  30.         else:
  31.             if action >= 0x80: # shift
  32.                 stack.append(gotos[state])
  33.                 action -= 0x80
  34.             if code != 0xFF: # nop
  35.                 state = code
  36.             if action > 0:
  37.                 do_action(action, ch, ds, ss, es)
  38.             break
  39.     return state
  40.  
  41. def do_action(action, ch, ds, ss, es):
  42.     if action == 0x1:
  43.         ds.append([])
  44.     elif action == 0x2:
  45.         ds.append({})
  46.     elif action == 0x3:
  47.         val = ds.pop()
  48.         ds[len(ds)-1].append(val)
  49.     elif action == 0x4:
  50.         val = ds.pop()
  51.         key = ds.pop()
  52.         ds[len(ds)-1][key] = val
  53.     elif action == 0x10:
  54.         ds.append(None)
  55.     elif action == 0x20:
  56.         ds.append(True)
  57.     elif action == 0x30:
  58.         ds.append(False)
  59.     elif action == 0x40:
  60.         val = u"".join(ss)
  61.         ds.append(val)
  62.         ss[:] = []
  63.         es[:] = []
  64.     elif action == 0x50:
  65.         val = int(u"".join(ss))
  66.         ds.append(val)
  67.         ss[:] = []
  68.     elif action == 0x60:
  69.         val = float(u"".join(ss))
  70.         ds.append(val)
  71.         ss[:] = []
  72.     elif action == 0xA:
  73.         ss.append(ch)
  74.     elif action == 0xB:
  75.         es.append(ch)
  76.     elif action == 0xC:
  77.         ss.append(unichr(escape_characters[ch]))
  78.     elif action == 0xD:
  79.         ss.append(unichr(int(u"".join(es), 16)))
  80.         es[:] = []
  81.     else:
  82.         assert False, "JSON decoder bug"
  83.  
  84. def read_file(filename):
  85.     with open(filename, "rb") as fd:
  86.         return fd.read().decode('utf-8''b': 8, 't': 9, 'n': 10, 'f': 12, 'r': 13}
  87.  
  88.  
  89. if __name__=="__main__":
  90.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement