bf17 icon

Alphabet Stew

bf17 | PRO | 03/14/18 10:40:55 PM UTC | 0 ⭐ | 1544 👁️ | Never ⏰ | []
Python |

8.16 KB

|

None

|

0 👍

/

0 👎

# 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