Advertisement
Guest User

mathparser.py

a guest
Dec 26th, 2016
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.47 KB | None | 0 0
  1. from __future__ import print_function
  2. from collections import deque, Iterator
  3.  
  4. OPEN_BRACES = set('([{')
  5. CLOSE_BRACES = set(')]}')
  6. OPERATORS = set('+-*/')
  7.  
  8. class PushbackIterator(Iterator):
  9.     def __init__(self, items):
  10.         self.items = iter(items)
  11.         self.buffer = deque()
  12.  
  13.     def __next__(self):
  14.         if self.buffer:
  15.             return self.buffer.popleft()
  16.         return next(self.items)
  17.  
  18.     next = __next__
  19.  
  20.     def push_back(self, item):
  21.         self.buffer.appendleft(item)
  22.    
  23.  
  24. def tokenize(term):
  25.     tokens = []
  26.     chars = PushbackIterator(term)
  27.     for char in chars:
  28.         if char in OPEN_BRACES:
  29.             tokens.append(tokenize(chars))
  30.         elif char in CLOSE_BRACES:
  31.             return tokens
  32.         elif char in OPERATORS:
  33.             tokens.append(char)
  34.         elif char.isdigit():
  35.             digits = [char]
  36.             for char in chars:
  37.                 if not char.isdigit():
  38.                     chars.push_back(char)
  39.                     break
  40.                 digits.append(char)
  41.             integer = int(''.join(digits))
  42.             tokens.append(integer)
  43.         else:
  44.             if not char.isspace():
  45.                 msg = 'unknown character: {!r}'
  46.                 raise ValueError(msg.format(char))
  47.     return tokens
  48.  
  49. def main():
  50.     term = '42  +   23  -  [1 * (3  +   243) - 5]/ 234'
  51.     print('tokenize({!r})'.format(term))
  52.     print('->', tokenize(term))
  53.  
  54. if __name__ == '__main__':
  55.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement