Created
June 3, 2016 23:01
-
-
Save rmccullagh/1c687579637da97a98f52543e9a40d1c to your computer and use it in GitHub Desktop.
foobar google
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import fileinput | |
import sys | |
EOF = -1 | |
TERMINAL = 0x01 | |
BINARY_TIMES = 0x02 | |
BINARY_PLUS = 0x03 | |
class Node(): | |
def __init__(self, tp, left, right): | |
self.tp = tp | |
self.left = left | |
self.right = right | |
class Parser(): | |
def __init__(self, txt): | |
self.txt = txt | |
self.pos = 0 | |
self.status = EOF | |
self.len = len(txt) | |
self.next() | |
def match(self, c): | |
if self.look == c: | |
self.next() | |
return 1 | |
else: | |
self.expected(c) | |
def expected(self, msg): | |
raise TypeError("unexpected token '{0}', expecting '{1}' at position {2}".format(self.look, msg, self.pos)) | |
sys.stdout.flush() | |
def get_num(self): | |
if not (self.look >= '0' and self.look <= '9'): | |
self.expected('/[0-9]+/') | |
else: | |
retval = self.look | |
self.next() | |
return retval | |
def next(self): | |
if self.pos >= self.len: | |
self.look = EOF | |
else: | |
self.look = self.txt[self.pos] | |
self.pos += 1 | |
def term(self): | |
left = self.factor() | |
stack = [] | |
stack.append(left) | |
while self.look == '*': | |
self.match('*') | |
right = self.factor() | |
stack.append(Node(BINARY_TIMES, stack.pop(), right)) | |
return stack.pop() | |
def factor(self): | |
return Node(TERMINAL, self.get_num(), None) | |
def expr(self): | |
left = self.term() | |
stack = [] | |
stack.append(left) | |
while self.look == '+': | |
self.match('+') | |
right = self.term() | |
stack.append(Node(BINARY_PLUS, stack.pop(), right)) | |
return stack.pop() | |
class Traversor(): | |
def __init__(self, tree): | |
self.tree = tree | |
def postorder(self, tree): | |
return self.process(tree) | |
def process(self, tree): | |
if tree.tp is TERMINAL: | |
return int(tree.left, 10) | |
if tree.tp is BINARY_TIMES: | |
return self.process(tree.left) * self.process(tree.right) | |
if tree.tp is BINARY_PLUS: | |
return self.process(tree.left) + self.process(tree.right) | |
def main(): | |
while True: | |
try: | |
data = raw_input("> ") | |
parser = Parser(data) | |
traversor = Traversor(parser.expr()) | |
val = traversor.postorder(traversor.tree) | |
sys.stdout.write(str(val)) | |
sys.stdout.write('\n') | |
sys.stdout.flush() | |
except TypeError as err: | |
print err | |
except EOFError as err: | |
sys.stdout.write('\n') | |
sys.stdout.write("Bye") | |
sys.stdout.write('\n') | |
sys.stdout.flush() | |
sys.exit(0) | |
if __name__ == "__main__": | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment