class Stack:
def __init__(self):
self.data = []
def push(self, x):
self.data.append(x)
def pop(self):
return self.data.pop()
class Interpreter:
def __init__(self):
self.stack = Stack()
def process(self, word):
if is_int(word):
n = int(word)
self.stack.push(n)
elif '"' in word:
self.stack.push(word.strip('"'))
else:
try:
f = words[word]
except KeyError:
raise SyntaxError, 'ERRor Unknown word\n\t'+word+'!!!'
# determine number of arguments
n = num_args(f)
# pop that number of args from stack
args = reversed([self.stack.pop() for i in range(n)])
# call f with that list
result = f(*args)
# take return value (a list)
# push elements on stack
for x in result or []:
self.stack.push(x)
def process_line(self, line):
words = line.split()
for word in words:
self.process(word)
def _print(x):
print x
def _pas():
pass
def _exit():
exit()
def _help():
print '''
words = {
'+': lambda x, y: [x+y],
'-': lambda x, y: [x-y],
'*': lambda x, y: [x*y],
'/': lambda x, y: [x/y],
'==': lambda x, y: [x==y],
'!=': lambda x, y: [x!=y],
'>': lambda x, y: [x>y],
'<': lambda x, y: [x<y],
'dup': lambda x: [x, x],
'drop': lambda x: [],
'swap': lambda x, y: [y, x],
'print': _print,
'chr': lambda x: [chr(x)],
'sweep': _pas,
'scan': lambda x: [raw_input(x)],
'exit': _exit,
'help': _help
}
'''
words = {
'+': lambda x, y: [x+y],
'-': lambda x, y: [x-y],
'*': lambda x, y: [x*y],
'/': lambda x, y: [x/y],
'==': lambda x, y: [x==y],
'!=': lambda x, y: [x!=y],
'>': lambda x, y: [x>y],
'<': lambda x, y: [x<y],
'dup': lambda x: [x, x],
'drop': lambda x: [],
'swap': lambda x, y: [y, x],
'print': _print,
'chr': lambda x: [chr(x)],
'sweep': _pas,
'scan': lambda x: [raw_input(x)],
'exit': _exit,
'help': _help,
'.': _pas
}
def num_args(f):
""" Return the number of arguments that function <f> takes. """
return f.func_code.co_argcount
def is_int(s):
try:
int(s)
except ValueError:
return False
else:
return True
if __name__ == "__main__":
import sys
e = Interpreter()
main = True
print '==================================================='
print '***************************************************'
print 'drinkable_chicken modified version 1.0.0 6.13.2013'
print 'A.W.T. 10 YRS. old'
print '***************************************************'
print 'IDE 1.0.1'
print '==================================================='
while main == True:
line = raw_input('> ')
if '.' in line:
e.process_line(line)
if 'sweep' in line:
e.stack.data = []
print "stack:", e.stack.data
else:
print 'ERRor command \n\tterminator not found!'