Advertisement
Guest User

mathparser.py

a guest
Dec 26th, 2016
166
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
  3.  
  4. OPEN_BRACES = set('([{')
  5. CLOSE_BRACES = set(')]}')
  6. OPERATORS = set('+-*/')
  7.  
  8. class Stack:
  9.     def __init__(self, items):
  10.         self.items = iter(items)
  11.         self.buffer = deque()
  12.  
  13.     def __iter__(self):
  14.         return self
  15.  
  16.     def __next__(self):
  17.         if self.buffer:
  18.             return self.buffer.popleft()
  19.         return next(self.items)
  20.  
  21.     next = __next__
  22.  
  23.     def push_back(self, item):
  24.         self.buffer.appendleft(item)
  25.    
  26.  
  27. def tokenize(term):
  28.     tokens = []
  29.     chars = Stack(term)
  30.     for char in chars:
  31.         if char in OPEN_BRACES:
  32.             tokens.append(tokenize(chars))
  33.         elif char in CLOSE_BRACES:
  34.             return tokens
  35.         elif char in OPERATORS:
  36.             tokens.append(char)
  37.         elif char.isdigit():
  38.             digits = [char]
  39.             for char in chars:
  40.                 if not char.isdigit():
  41.                     chars.push_back(char)
  42.                     break
  43.                 digits.append(char)
  44.             integer = int(''.join(digits))
  45.             tokens.append(integer)
  46.         else:
  47.             if not char.isspace():
  48.                 msg = 'unknown character: {!r}'
  49.                 raise ValueError(msg.format(char))
  50.     return tokens
  51.  
  52. def main():
  53.     term = '42  +   23  -  [1 * (3  +   243) - 5]/ 234'
  54.     print('tokenize({!r})'.format(term))
  55.     print('->', tokenize(term))
  56.  
  57. if __name__ == '__main__':
  58.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement