Skip to content

Instantly share code, notes, and snippets.

@rmccullagh
Created June 3, 2016 23:01
Show Gist options
  • Save rmccullagh/1c687579637da97a98f52543e9a40d1c to your computer and use it in GitHub Desktop.
Save rmccullagh/1c687579637da97a98f52543e9a40d1c to your computer and use it in GitHub Desktop.
foobar google
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