Advertisement
bf17

BF Interpreter

May 6th, 2017 (edited)
258
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.95 KB | None | 0 0
  1. # Pythonista 3.5
  2. # brainfuck interpreter
  3. # latest update: 202202010710
  4.  
  5. from array import array
  6.  
  7. p =      0  # data pointer
  8. high_p = 0  # highest value of p
  9. pc =     0  # program counter
  10. top =    0  # top of the stack
  11. tc =     0  # total command count
  12. steps =  0  # number of execution steps
  13. command_set = "<>+-,.[]!"
  14.  
  15. prog_mem = ""
  16. data_mem =      array('B')
  17. data_mem =      [ 0 for i in range(65536)]
  18. stack =         array('I')
  19. stack =         [ 0 for i in range(32768)]
  20. open_bracket =  array('I')
  21. open_bracket =  [ 0 for i in range(32768)]
  22. close_bracket = array('I')
  23. close_bracket = [ 0 for i in range(32768)]
  24. bracket_check = ""
  25. bracket_counter = 0
  26. bc_counter = 0   #bracket_check counter
  27. nesting_levels = 0
  28. key_press = ""
  29. input_buffer = ""
  30.  
  31. def printable(n):
  32.    if((n>31 and n<127) or n == 10):
  33.        return(True)
  34.    else:
  35.        return(False)
  36.  
  37. # whole memory output from 0 to highest value of 'p'
  38. def dump(x):   # x should only be current value of p
  39.    format_count = 0
  40.    print()
  41.    for i in range(high_p + 1):
  42.        if(i == x):
  43.            left_cc = "{"    # put an indcator
  44.            right_cc = "}"   # around the current cell
  45.        else:
  46.            left_cc = " "
  47.            right_cc = " "
  48.        
  49.        if(printable(data_mem[i])):
  50.            print("|" + left_cc + "%05d" % i + chr(data_mem[i]) + "%03d" % data_mem[i], end = right_cc)
  51.            format_count += 1
  52.            if(format_count % 8 == 0): print("|")
  53.        else:
  54.            print("|" + left_cc + "%05d" % i + " " + "%03d" % data_mem[i], end = right_cc)
  55.            format_count += 1
  56.            if(format_count % 8 == 0): print("|")
  57.  
  58.    print("|")
  59.  
  60. # load bf program into memory
  61. file = open(input("bf file: "), 'r')
  62.  
  63. while True:
  64.    nextch = file.read(1)
  65.    if(not nextch):
  66.        file.close()
  67.        break
  68.    if(nextch in command_set):
  69.        prog_mem += (nextch)
  70.  
  71. tc = len(prog_mem)
  72.  
  73. # check bracket integrity #################################
  74. for i in range(tc):
  75.    if(prog_mem[i] == "[" or prog_mem[i] == "]"):
  76.        bracket_check += prog_mem[i]
  77.  
  78. for i in range(len(bracket_check)):
  79.    if(bracket_check[i] == "["):
  80.        bc_counter += 1
  81.        nesting_levels = max(bc_counter, nesting_levels)
  82.    elif(bracket_check[i] == "]"):
  83.        bc_counter -= 1
  84.        if(bc_counter < 0):
  85.            print("mismatch")
  86.            quit()
  87.  
  88. if(bc_counter != 0):
  89.    print("mismatch")
  90.    quit()
  91. #########not THAT necessary to check bracket formatting###
  92.  
  93. # calculate bracket locations, store in bracket stacks
  94. for i in range(tc):
  95.    if(prog_mem[i] == '['):
  96.        top += 1
  97.        stack[top] = i
  98.    elif(prog_mem[i] == ']'):
  99.        close_bracket[bracket_counter] = i
  100.        open_bracket[bracket_counter] = stack[top]
  101.        top -= 1
  102.        bracket_counter += 1
  103.  
  104. # run bf program
  105. while(pc < len(prog_mem)):
  106.    if(prog_mem[pc] == "+"):
  107.        data_mem[p] = (data_mem[p] + 1) % 256
  108.        pc    += 1
  109.        steps += 1
  110. #       print("+", end = "") #expand brackets
  111.  
  112.    elif(prog_mem[pc] == "-"):
  113.        data_mem[p] = (data_mem[p] - 1) % 256
  114.        pc    += 1
  115.        steps += 1
  116. #       print("-", end = "") #expand brackets
  117.  
  118.    elif(prog_mem[pc] == ">"):
  119.        p     += 1
  120.        high_p = max(p, high_p)
  121.        pc    += 1
  122.        steps += 1
  123. #       print(">", end = "") #expand brackets
  124.  
  125. # no checking is performed to catch p < 0
  126.    elif(prog_mem[pc] == "<"):
  127.        p     -= 1
  128.        pc    += 1
  129.        steps += 1
  130. #       print("<", end = "") #expand brackets
  131.  
  132.    elif(prog_mem[pc] == "."):
  133.        if(printable(data_mem[p])):
  134.            print(chr(data_mem[p]), end = "")
  135.        pc    += 1
  136.        steps += 1
  137. #       print(".", end = "") #expand brackets
  138.  
  139. # INPUT
  140. # enter one char at a time, or several
  141. # they will be used as needed
  142. # use one more prompt to enter (cr) for EOF
  143.    elif(prog_mem[pc] == ","):
  144.        if(input_buffer == ""):
  145.            input_buffer = input(": ")
  146.        
  147.        if(input_buffer == ""): # still empty - (cr) entered
  148.            data_mem[p] = 0
  149.        else:
  150.            key_press = input_buffer[0]
  151.            input_buffer = input_buffer[1:]
  152.            data_mem[p] = ord(key_press)
  153.  
  154.        pc    += 1
  155.        steps += 1
  156. #       print(",", end = "") #uncomment to expand brackets
  157.  
  158.    elif(prog_mem[pc] == "["):
  159.        steps += 1
  160.        if(data_mem[p] == 0):
  161.            pc = close_bracket[open_bracket.index(pc)] + 1
  162.        else:
  163.            pc += 1
  164.    
  165.    elif(prog_mem[pc] == "]"):
  166. #       steps += 1  # close brackets not typically counted
  167.        pc = open_bracket[close_bracket.index(pc)]
  168.    
  169.    elif(prog_mem[pc] == "!"):
  170.        pc += 1
  171.        dump(p)  #  p simply marks position of data pointer
  172.  
  173. # print out program data
  174. print("\n\n   highest value of P: ", high_p)
  175. print("current location of P: ",p)
  176. print("       total commands: ", tc - prog_mem.count("!"))
  177. print("          total steps: ", steps)
  178. print("       nesting levels: ", nesting_levels)
  179. print("  total bracket pairs: ", bracket_counter)
  180. print()
  181.  
  182.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement