# Pythonista 3.5
# alphabet_stew interpreter
# latest update: 2018
#
from array import array
p = 0 # data pointer
high_p = 0 # highest value of p
pc = 0 # program counter
top = 0 # top of the stack, where next value goes
high_top = 0 # highest value of t.
tc = 0 # total command count
steps = 0 # number of execution steps
xch_temp = 0 # xchg command temporary storage
command_set = "abcdefghijklmnopqrstuvwxyz!"
prog_mem = ""
data_mem = array('B')
data_mem = [ 0 for i in range(100000)]
stack = array('I')
stack = [ 0 for i in range(2000)]
open_loop = array('I')
open_loop = [ 0 for i in range(2000)]
close_loop = array('I')
close_loop = [ 0 for i in range(2000)]
loop_check = ""
loop_counter = 0
bc_counter = 0 #loop_check counter
nesting_levels = 0
##################################################
# define functions
def find_open(x):
return(open_loop[close_loop.index(x)])
def find_close(x):
return(close_loop[open_loop.index(x)])
def printable(n):
if(n>31 and n<127):
return(True)
else:
return(False)
# whole memory output from 0 to highest value of 'p'
def dump(x): # x should only be current value of p
format_count = 0
print()
for i in range(high_p + 1):
if(i == x):
left_cc = "{"
right_cc = "}"
else:
left_cc = " "
right_cc = " "
if(printable(data_mem[i])):
print("|" + left_cc + "%05d" % i + chr(data_mem[i]) + "%03d" % data_mem[i], end = right_cc)
format_count += 1
if(format_count % 8 == 0): print("|")
else:
print("|" + left_cc + "%05d" % i + " " + "%03d" % data_mem[i], end = right_cc)
format_count += 1
if(format_count % 8 == 0): print("|")
print("|")
def prog_data():
print("\nprogram counter: ", pc)
print("total commands: ", tc - prog_mem.count("!"))
print("total steps: ", steps)
print("nesting levels: ", nesting_levels)
print("total loops: ", loop_counter)
print()
def stack_print():
print("Stack")
if(high_top < 1):
print("***Not Used***")
for i in range(top - 1, -1, -1):
print(i, stack[i], end = "")
if(i == top - 1):
print(" *")
else:
print("")
if((top == 0) & (high_top > 0)):
print("Stack Empty")
##################################################
# load program into memory
#file = open(input("file: "), 'r')
file = open("a.txt", 'r')
while True:
nextch = file.read(1)
if(not nextch):
file.close()
break
if(nextch in command_set):
prog_mem += (nextch)
tc = len(prog_mem)
print("01234567890123456789")
print(prog_mem)
file.close()
##################################################
# check loop integrity
for i in range(tc):
if(prog_mem[i] == "t" or prog_mem[i] == "i"):
loop_check += prog_mem[i]
for i in range(len(loop_check)):
if(loop_check[i] == "t"):
bc_counter += 1
nesting_levels = max(bc_counter, nesting_levels)
elif(loop_check[i] == "i"):
bc_counter -= 1
if(bc_counter < 0):
print("Loop mismatch")
quit()
if(bc_counter != 0):
print("Loop mismatch")
quit()
##################################################
# calculate loop locations, store in loop stack
for i in range(tc):
if(prog_mem[i] == 't'):
top += 1
stack[top] = i
elif(prog_mem[i] == 'i'):
close_loop[loop_counter] = i
open_loop[loop_counter] = stack[top]
top -= 1
loop_counter += 1
##################################################
# run program
while(pc < len(prog_mem)):
if(prog_mem[pc] == "g"): #add
if(top < 2):
print("Stack Error")
quit()
stack[top - 2] = (stack[top - 1] + stack[top -2]) % 256
top -= 1
pc += 1
steps += 1
elif(prog_mem[pc] == "p"): #and
if(top < 2):
print("Stack Error")
quit()
stack[top - 2] = (stack[top - 1] & stack[top -2]) % 256
top -= 1
pc += 1
steps += 1
elif(prog_mem[pc] == "q"): #or
if(top < 2):
print("Stack Error")
quit()
stack[top - 2] = (stack[top - 1] | stack[top -2]) % 256
top -= 1
pc += 1
steps += 1
elif(prog_mem[pc] == "y"): #not mem
data_mem[p] = 255 - data_mem[p]
pc += 1
steps += 1
elif(prog_mem[pc] == "z"): #input ascii (',')
data_mem[p] = ord(input("input character: "))
pc += 1
steps += 1
elif(prog_mem[pc] == "x"): #sub
if(top < 2):
print("Stack Error")
quit()
stack[top - 2] = (stack[top - 1] - stack[top -2]) % 256
top -= 1
pc += 1
steps += 1
elif(prog_mem[pc] == "t"): #[
steps += 1
if(data_mem[p] == 0):
pc = close_loop[open_loop.index(pc)] + 1
else:
pc += 1
elif(prog_mem[pc] == "m"): #shl mem
data_mem[p] = (data_mem[p] << 1) % 256
pc += 1
steps += 1
elif(prog_mem[pc] == "a"): #shr mem
data_mem[p] = (data_mem[p] >> 1) % 256
pc += 1
steps += 1
elif(prog_mem[pc] == "f"): #jmp left
pc -= data_mem[p]
steps += 1
elif(prog_mem[pc] == "k"): #xor
if(top < 2):
print("Stack Error")
quit()
stack[top - 2] = (stack[top - 1] ^ stack[top - 2]) % 256
top -= 1
pc += 1
steps += 1
elif(prog_mem[pc] == "o"): #push mem
stack[top] = data_mem[p]
top += 1
high_top = max(top, high_top)
pc += 1
steps += 1
elif(prog_mem[pc] == "l"): #pop
if(top < 1):
print("Stack Error")
quit()
top -= 1
data_mem[p] = stack[top]
stack[top] = 0
Z = int(data_mem[p] == 0)
pc += 1
steps += 1
elif(prog_mem[pc] == "h"): #jmp right
pc += data_mem[p]
steps += 1
elif(prog_mem[pc] == "n"): #halt
prog_data()
stack_print()
print("\nProgram Halt")
quit()
pc += 1
steps += 1
elif(prog_mem[pc] == "c"): #peek
if(top < 1):
print("Stack Error")
quit()
top -= 1
data_mem[p] = stack[top]
top += 1
pc += 1
steps += 1
elif(prog_mem[pc] == "u"): #dec mem
data_mem[p] = (data_mem[p] - 1) % 256
pc += 1
steps += 1
elif(prog_mem[pc] == "e"): #inc mem
data_mem[p] = (data_mem[p] + 1) % 256
pc += 1
steps += 1
elif(prog_mem[pc] == "r"): #input dec
data_mem[p] = int(input("Enter Decimal Number: ")) % 256
pc += 1
steps += 1
elif(prog_mem[pc] == "b"): #output ascii
if(printable(data_mem[p])):
print(chr(data_mem[p]), end = "")
else:
if(data_mem[p] == 10):
print("\n")
else:
print(end = "")
pc += 1
steps += 1
elif(prog_mem[pc] == "w"): #xchg
if(top < 2):
print("Stack Error")
quit()
xch_temp = stack[top - 1]
stack[top - 1] = stack[top - 2]
stack[top - 2] = xch_temp
pc += 1
steps += 1
elif(prog_mem[pc] == "j"): #clear stack
top = 0
pc += 1
steps += 1
elif(prog_mem[pc] == "s"): #>
p += 1
high_p = max(p, high_p)
pc += 1
steps += 1
elif(prog_mem[pc] == "v"): #output dec
print('{:03d}'.format(data_mem[p]), end = "")
pc += 1
steps += 1
elif(prog_mem[pc] == "i"): #]
steps += 1
pc = open_loop[close_loop.index(pc)]
elif(prog_mem[pc] == "d"): #<
p -= 1
if(p < 0):
print("Data Pointer Underflow")
quit()
pc += 1
steps += 1
elif(prog_mem[pc] == "!"): #dump mem
dump(p)
pc += 1
prog_data()
stack_print()
Comments