Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from __future__ import print_function
- from collections import deque
- OPEN_BRACES = set('([{')
- CLOSE_BRACES = set(')]}')
- OPERATORS = set('+-*/')
- class Stack:
- def __init__(self, items):
- self.items = iter(items)
- self.buffer = deque()
- def __iter__(self):
- return self
- def __next__(self):
- if self.buffer:
- return self.buffer.popleft()
- return next(self.items)
- next = __next__
- def push_back(self, item):
- self.buffer.appendleft(item)
- def tokenize(term):
- tokens = []
- chars = Stack(term)
- for char in chars:
- if char in OPEN_BRACES:
- tokens.append(tokenize(chars))
- elif char in CLOSE_BRACES:
- return tokens
- elif char in OPERATORS:
- tokens.append(char)
- elif char.isdigit():
- digits = [char]
- for char in chars:
- if not char.isdigit():
- chars.push_back(char)
- break
- digits.append(char)
- integer = int(''.join(digits))
- tokens.append(integer)
- else:
- if not char.isspace():
- msg = 'unknown character: {!r}'
- raise ValueError(msg.format(char))
- return tokens
- def main():
- term = '42 + 23 - [1 * (3 + 243) - 5]/ 234'
- print('tokenize({!r})'.format(term))
- print('->', tokenize(term))
- if __name__ == '__main__':
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement