Advertisement
hazer_hazer

Untitled

Nov 17th, 2019
458
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.89 KB | None | 0 0
  1. class Parser():
  2.     def __init__(self, tokens):
  3.         self.tokens = tokens
  4.         self.i = 0
  5.         self.t = None
  6.  
  7.     def peek(self):
  8.         if self.end():
  9.             return None
  10.         self.t = self.tokens[self.i]
  11.         return self.t
  12.  
  13.     def advance(self):
  14.         self.i += 1
  15.         return self.peek()
  16.  
  17.     def end(self):
  18.         return self.i >= len(self.tokens)
  19.  
  20.     def parse(self):
  21.         self.peek()
  22.         if self.t['type'] == '{':
  23.             result = self.parseObject()
  24.         else:
  25.             self.error('JSON Must start with brace `{`')
  26.  
  27.         return result
  28.  
  29.     def parseObject(self):
  30.         self.advance()
  31.         pairs = []
  32.         first = True
  33.  
  34.         while not self.end():
  35.             if self.t['type'] == '}':
  36.                 break
  37.             if first:
  38.                 first = False
  39.             elif self.t['type'] == ',':
  40.                 self.advance()
  41.             if self.t['type'] == '}':
  42.                 break
  43.  
  44.             pairs.append(self.parsePair())
  45.  
  46.  
  47.         self.advance()
  48.  
  49.         return pairs
  50.  
  51.     def parsePair(self):
  52.         if self.t['type'] != 'str':
  53.             self.error('Key must be type of string')
  54.  
  55.         key = self.t['val']
  56.         val = ''
  57.         tp = 'val'
  58.         dataType = 'none'
  59.  
  60.         self.advance()
  61.  
  62.         if self.t['type'] != ':':
  63.             self.error('Expected colon `:`')
  64.  
  65.         self.advance()
  66.  
  67.         if self.t['type'] in [ 'str', 'num', 'kw' ]:
  68.             val = self.t['val']
  69.             if self.t['type'] == 'str':
  70.                 dataType = 'string'
  71.             elif self.t['type'] == 'kw' and self.t['val'] in [ 'false', 'true' ]:
  72.                 dataType = 'bool'
  73.             elif self.t['type'] == 'num':
  74.                 dataType = 'double' if '.' in self.t['type'] else 'int'
  75.             elif self.t['type'] == 'kw' and self.t['val'] == 'null':
  76.                 dataType = 'null'
  77.             else:
  78.                 self.error('Unexpected type of token ' + self.t['type'])
  79.         elif self.t['type'] == '{':
  80.             val = self.parseObject()
  81.             tp = 'obj'
  82.         else:
  83.             self.error('Unexpected type of token ' + self.t['type'])
  84.  
  85.         self.advance()
  86.  
  87.         return {
  88.             "key": key,
  89.             "val": val,
  90.             "type": tp,
  91.             "dataType": dataType
  92.         }
  93.  
  94.     def error(self, message):
  95.         raise Exception('[PARSER][ERROR] ' + message)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement