hazer_hazer

Untitled

Nov 17th, 2019
341
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.67 KB | None | 0 0
  1. import re
  2.  
  3. def isWhiteSpace(s):
  4.     return bool(re.match(r'\s', s))
  5.  
  6. def isDigit(s):
  7.     return bool(re.match(r'[0-9]', s))
  8.  
  9. def isQuote(s):
  10.     return s == '"'
  11.  
  12. def isPunc(s):
  13.     return s in ':}{,[]'
  14.  
  15. def isKeyword(s):
  16.     return s in [ 'true', 'false', 'null' ]
  17.  
  18. def isAlpha(s):
  19.     return bool(re.match(r'[a-zA-Z]', s))
  20.  
  21. class Lexer:
  22.     def __init__(self, json):
  23.         self.json = json
  24.         self.i = 0
  25.         self.c = ''
  26.         self.tokens = []
  27.  
  28.     def end(self):
  29.         return self.i >= len(self.json)
  30.  
  31.     def addToken(self, tp, val = ''):
  32.         self.tokens.append({ "type": tp, "val": val })
  33.  
  34.     def peek(self):
  35.         if self.end():
  36.             return None
  37.         self.c = self.json[self.i]
  38.         return self.c
  39.  
  40.     def advance(self):
  41.         self.i += 1
  42.         return self.peek()
  43.  
  44.     def lex(self):
  45.         while not self.end():
  46.             self.peek()
  47.             if isWhiteSpace(self.c):
  48.                 self.advance()
  49.             elif isDigit(self.c):
  50.                 num = self.c
  51.                 while isDigit(self.advance()):
  52.                     num += self.c
  53.                 if self.c == '.':
  54.                     num += self.c
  55.                     while isDigit(self.advance()):
  56.                         num += self.c
  57.                 self.addToken('num', num)
  58.             elif isQuote(self.c):
  59.                 s = ''
  60.                 while not isQuote(self.advance()):
  61.                     s += self.c
  62.                 self.addToken('str', s)
  63.                 self.advance()
  64.             elif isPunc(self.c):
  65.                 self.addToken(self.c)
  66.                 self.advance()
  67.             elif isAlpha(self.c):
  68.                 word = self.c
  69.                 while isAlpha(self.advance()):
  70.                     word += self.c
  71.                 if not isKeyword(word):
  72.                     self.error('Unrecognized keyword \'' + word + '\'. Expected true | false | null')
  73.                 self.addToken('kw', word)
  74.             else:
  75.                 self.error('Unrecognized token ' + self.c)
  76.  
  77.         return self.tokens
  78.  
  79.     def error(self, message):
  80.         raise Exception('[LEXER]:[ERROR] ' + message);
Add Comment
Please, Sign In to add comment