Advertisement
bf17

Alphabet Stew

Mar 14th, 2018
1,182
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.16 KB | None | 0 0
  1. # Pythonista 3.5
  2. # alphabet_stew interpreter
  3. # latest update: 2018
  4. #
  5.  
  6. from array import array
  7.  
  8. p = 0         # data pointer
  9. high_p = 0    # highest value of p
  10. pc = 0        # program counter
  11. top = 0       # top of the stack, where next value goes
  12. high_top = 0  # highest value of t.
  13. tc = 0        # total command count
  14. steps = 0     # number of execution steps
  15. xch_temp = 0  # xchg command temporary storage
  16. command_set = "abcdefghijklmnopqrstuvwxyz!"
  17. prog_mem =    ""
  18. data_mem =    array('B')
  19. data_mem =    [ 0 for i in range(100000)]
  20. stack =       array('I')
  21. stack =       [ 0 for i in range(2000)]
  22. open_loop =   array('I')
  23. open_loop =   [ 0 for i in range(2000)]
  24. close_loop =  array('I')
  25. close_loop =  [ 0 for i in range(2000)]
  26. loop_check =  ""
  27. loop_counter = 0
  28. bc_counter = 0   #loop_check counter
  29. nesting_levels = 0
  30.  
  31. ##################################################
  32. # define functions
  33. def find_open(x):
  34.    return(open_loop[close_loop.index(x)])
  35.  
  36. def find_close(x):
  37.    return(close_loop[open_loop.index(x)])
  38.  
  39. def printable(n):
  40.    if(n>31 and n<127):
  41.        return(True)
  42.    else:
  43.        return(False)
  44.  
  45. # whole memory output from 0 to highest value of 'p'
  46. def dump(x):   # x should only be current value of p
  47.    format_count = 0
  48.    print()
  49.    for i in range(high_p + 1):
  50.        if(i == x):
  51.            left_cc = "{"
  52.            right_cc = "}"
  53.        else:
  54.            left_cc = " "
  55.            right_cc = " "
  56.        
  57.        if(printable(data_mem[i])):
  58.            print("|" + left_cc + "%05d" % i + chr(data_mem[i]) + "%03d" % data_mem[i], end = right_cc)
  59.            format_count += 1
  60.            if(format_count % 8 == 0): print("|")
  61.        else:
  62.            print("|" + left_cc + "%05d" % i + " " + "%03d" % data_mem[i], end = right_cc)
  63.            format_count += 1
  64.            if(format_count % 8 == 0): print("|")
  65.    print("|")
  66.  
  67. def prog_data():
  68.     print("\nprogram counter: ", pc)
  69.     print("total commands: ", tc - prog_mem.count("!"))
  70.     print("total steps: ", steps)
  71.     print("nesting levels: ", nesting_levels)
  72.     print("total loops: ", loop_counter)
  73.     print()
  74.  
  75. def stack_print():
  76.     print("Stack")
  77.     if(high_top < 1):
  78.         print("***Not Used***")
  79.     for i in range(top - 1, -1, -1):
  80.         print(i, stack[i], end = "")
  81.         if(i == top - 1):
  82.             print(" *")
  83.         else:
  84.             print("")
  85.     if((top == 0) & (high_top > 0)):
  86.         print("Stack Empty")
  87.  
  88. ##################################################
  89. # load program into memory
  90. #file = open(input("file: "), 'r')
  91. file = open("a.txt", 'r')
  92.  
  93. while True:
  94.    nextch = file.read(1)
  95.    if(not nextch):
  96.        file.close()
  97.        break
  98.    if(nextch in command_set):
  99.        prog_mem += (nextch)
  100.  
  101. tc = len(prog_mem)
  102. print("01234567890123456789")
  103. print(prog_mem)
  104. file.close()
  105.  
  106.  
  107. ##################################################
  108. # check loop integrity
  109. for i in range(tc):
  110.    if(prog_mem[i] == "t" or prog_mem[i] == "i"):
  111.        loop_check += prog_mem[i]
  112.  
  113. for i in range(len(loop_check)):
  114.    if(loop_check[i] == "t"):
  115.        bc_counter += 1
  116.        nesting_levels = max(bc_counter, nesting_levels)
  117.    elif(loop_check[i] == "i"):
  118.        bc_counter -= 1
  119.        if(bc_counter < 0):
  120.            print("Loop mismatch")
  121.            quit()
  122.  
  123. if(bc_counter != 0):
  124.    print("Loop mismatch")
  125.    quit()
  126.  
  127. ##################################################
  128. # calculate loop locations, store in loop stack
  129. for i in range(tc):
  130.    if(prog_mem[i] == 't'):
  131.        top += 1
  132.        stack[top] = i
  133.    elif(prog_mem[i] == 'i'):
  134.        close_loop[loop_counter] = i
  135.        open_loop[loop_counter] = stack[top]
  136.        top -= 1
  137.        loop_counter += 1
  138.  
  139. ##################################################
  140. # run program
  141. while(pc < len(prog_mem)):
  142.    if(prog_mem[pc] == "g"):   #add
  143.        if(top < 2):
  144.            print("Stack Error")
  145.            quit()
  146.        stack[top - 2] = (stack[top - 1] + stack[top -2]) % 256
  147.        top -= 1
  148.        pc += 1
  149.        steps += 1
  150.    
  151.    elif(prog_mem[pc] == "p"): #and
  152.        if(top < 2):
  153.            print("Stack Error")
  154.            quit()
  155.        stack[top - 2] = (stack[top - 1] & stack[top -2]) % 256
  156.        top -= 1
  157.        pc += 1
  158.        steps += 1
  159.    
  160.    elif(prog_mem[pc] == "q"): #or
  161.        if(top < 2):
  162.            print("Stack Error")
  163.            quit()
  164.        stack[top - 2] = (stack[top - 1] | stack[top -2]) % 256
  165.        top -= 1
  166.        pc += 1
  167.        steps += 1
  168.    
  169.    elif(prog_mem[pc] == "y"): #not mem
  170.        data_mem[p] = 255 - data_mem[p]
  171.        pc += 1
  172.        steps += 1
  173.    
  174.    elif(prog_mem[pc] == "z"): #input ascii (',')
  175.        data_mem[p] = ord(input("input character: "))
  176.        pc += 1
  177.        steps += 1
  178.    
  179.    elif(prog_mem[pc] == "x"): #sub
  180.        if(top < 2):
  181.            print("Stack Error")
  182.            quit()
  183.        stack[top - 2] = (stack[top - 1] - stack[top -2]) % 256
  184.        top -= 1
  185.        pc += 1
  186.        steps += 1
  187.    
  188.    elif(prog_mem[pc] == "t"): #[
  189.        steps += 1
  190.        if(data_mem[p] == 0):
  191.            pc = close_loop[open_loop.index(pc)] + 1
  192.        else:
  193.            pc += 1
  194.  
  195.    elif(prog_mem[pc] == "m"): #shl mem
  196.        data_mem[p] = (data_mem[p] << 1) % 256
  197.        pc += 1
  198.        steps += 1
  199.    
  200.    elif(prog_mem[pc] == "a"): #shr mem
  201.        data_mem[p] = (data_mem[p] >> 1) % 256
  202.        pc += 1
  203.        steps += 1
  204.    
  205.    elif(prog_mem[pc] == "f"): #jmp left
  206.        pc -= data_mem[p]
  207.        steps += 1
  208.    
  209.    elif(prog_mem[pc] == "k"): #xor
  210.        if(top < 2):
  211.            print("Stack Error")
  212.            quit()
  213.        stack[top - 2] = (stack[top - 1] ^ stack[top - 2]) % 256
  214.        top -= 1
  215.        pc += 1
  216.        steps += 1
  217.    
  218.    elif(prog_mem[pc] == "o"): #push mem
  219.        stack[top] = data_mem[p]
  220.        top += 1
  221.        high_top = max(top, high_top)
  222.        pc += 1
  223.        steps += 1
  224.    
  225.    elif(prog_mem[pc] == "l"): #pop
  226.        if(top < 1):
  227.            print("Stack Error")
  228.            quit()
  229.        top -= 1
  230.        data_mem[p] = stack[top]
  231.        stack[top] = 0
  232.        Z = int(data_mem[p] == 0)
  233.        pc += 1
  234.        steps += 1
  235.    
  236.    elif(prog_mem[pc] == "h"): #jmp right
  237.        pc += data_mem[p]
  238.        steps += 1
  239.    
  240.    elif(prog_mem[pc] == "n"): #halt
  241.        prog_data()
  242.        stack_print()
  243.        print("\nProgram Halt")
  244.        quit()
  245.        pc += 1
  246.        steps += 1
  247.    
  248.    elif(prog_mem[pc] == "c"): #peek
  249.        if(top < 1):
  250.            print("Stack Error")
  251.            quit()
  252.        top -= 1
  253.        data_mem[p] = stack[top]
  254.        top += 1
  255.        pc += 1
  256.        steps += 1
  257.    
  258.    elif(prog_mem[pc] == "u"): #dec mem
  259.        data_mem[p] = (data_mem[p] - 1) % 256
  260.        pc += 1
  261.        steps += 1
  262.    
  263.    elif(prog_mem[pc] == "e"): #inc mem
  264.        data_mem[p] = (data_mem[p] + 1) % 256
  265.        pc += 1
  266.        steps += 1
  267.    
  268.    elif(prog_mem[pc] == "r"): #input dec
  269.        data_mem[p] = int(input("Enter Decimal Number: ")) % 256
  270.        pc += 1
  271.        steps += 1
  272.    
  273.    elif(prog_mem[pc] == "b"): #output ascii
  274.        if(printable(data_mem[p])):
  275.            print(chr(data_mem[p]), end = "")
  276.        else:
  277.            if(data_mem[p] == 10):
  278.                print("\n")
  279.            else:
  280.                print(end = "")
  281.        pc += 1
  282.        steps += 1
  283.    
  284.    elif(prog_mem[pc] == "w"): #xchg
  285.        if(top < 2):
  286.            print("Stack Error")
  287.            quit()
  288.        xch_temp = stack[top - 1]
  289.        stack[top - 1] = stack[top - 2]
  290.        stack[top - 2] = xch_temp
  291.        pc += 1
  292.        steps += 1
  293.    
  294.    elif(prog_mem[pc] == "j"): #clear stack
  295.        top = 0
  296.        pc += 1
  297.        steps += 1
  298.    
  299.    elif(prog_mem[pc] == "s"): #>
  300.        p += 1
  301.        high_p = max(p, high_p)
  302.        pc += 1
  303.        steps += 1
  304.    
  305.    elif(prog_mem[pc] == "v"): #output dec
  306.        print('{:03d}'.format(data_mem[p]), end = "")
  307.        pc += 1
  308.        steps += 1
  309.    
  310.    elif(prog_mem[pc] == "i"): #]
  311.        steps += 1
  312.        pc = open_loop[close_loop.index(pc)]
  313.  
  314.    elif(prog_mem[pc] == "d"): #<
  315.        p -= 1
  316.        if(p < 0):
  317.             print("Data Pointer Underflow")
  318.             quit()
  319.        pc += 1
  320.        steps += 1
  321.    
  322.    elif(prog_mem[pc] == "!"): #dump mem
  323.        dump(p)
  324.        pc += 1
  325.  
  326. prog_data()
  327. stack_print()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement