Advertisement
bf17

Grawlix interpreter

Oct 16th, 2017
287
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 10.06 KB | None | 0 0
  1. # Pythonista 3.5
  2. # Grawlix Programming Language
  3. # Last update: 2017
  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. top_max = 0 # highest value of top
  12. tc = 0      # total command count
  13. steps = 0   # number of execution steps
  14. command_set = "><+-,.[];:?(){}@/|=^!#"
  15.  
  16. prog_mem = ""
  17. nextch = ""
  18. key_press = ""
  19. input_buffer = ""
  20. data_mem =      array('B')
  21. data_mem =      [0] * 100000
  22. stack =         array('I')
  23. stack =         [0] * 100000
  24.  
  25. bracket_check = ""
  26. bracket_counter = 0
  27. bc_counter = 0   #bracket_check counter
  28. nesting_levels = 0 # for brackets
  29. open_bracket =  array('I')
  30. open_bracket =  [0] * 100000
  31. close_bracket = array('I')
  32. close_bracket = [0] * 100000
  33.  
  34. paren_check =  ""
  35. paren_counter = 0
  36. paren_check_counter = 0
  37. paren_nesting_levels = 0
  38. open_paren =  array('I')
  39. open_paren =  [0] * 100000
  40. close_paren = array('I')
  41. close_paren = [0] * 100000
  42.  
  43. brace_check =  ""
  44. brace_counter = 0
  45. brace_check_counter = 0
  46. brace_nesting_levels = 0
  47. function_call_number = 0
  48. number_of_functions = 0
  49. open_brace =  array('I')
  50. open_brace =  [0] * 100000
  51. close_brace = array('I')
  52. close_brace = [0] * 100000
  53. function_return_stack = array('I')
  54. function_return_stack = [0] * 256
  55. function_return_top = 0
  56.  
  57. # define functions
  58. def printable(n):
  59.    if((n>31 and n<127) or n == 10):
  60.        return(True)
  61.    else:
  62.        return(False)
  63.  
  64. def find_open_bracket(x):
  65.    return(open_bracket[close_bracket.index(x)])
  66.  
  67. def find_close_bracket(x):
  68.    return(close_bracket[open_bracket.index(x)])
  69.  
  70. def find_open_paren(x):
  71.    return(open_paren[close_paren.index(x)])
  72.  
  73. def find_close_paren(x):
  74.    return(close_paren[open_paren.index(x)])
  75.  
  76. def find_open_brace(x):# functions
  77.    return(open_brace[close_brace.index(x)])
  78.  
  79. def find_close_brace(x):
  80.    return(close_brace[open_brace.index(x)])
  81.  
  82. def dump(x):   # x should only be current value of p
  83.    format_count = 0
  84.    print()
  85.    for i in range(high_p + 1):
  86.        if(i == x):
  87.            left_cc = "{"
  88.            right_cc = "}"
  89.        else:
  90.            left_cc = " "
  91.            right_cc = " "
  92.        if(printable(data_mem[i])):
  93.            print("|" + left_cc + "%05d" % i + chr(data_mem[i]) + "%03d" % data_mem[i], end = right_cc)
  94.            format_count += 1
  95.            if(format_count % 8 == 0): print("|")
  96.        else:
  97.            print("|" + left_cc + "%05d" % i + " " + "%03d" % data_mem[i], end = right_cc)
  98.            format_count += 1
  99.            if(format_count % 8 == 0): print("|")
  100.  
  101.    print("|")
  102.    #                 print out stack  
  103.    if(top > 0):
  104.        print()
  105.        for i in range(top):
  106.            print('{:03d}'.format(i), '{:03d}'.format(stack[i]))
  107.  
  108. def prog_data():
  109.     print("\ntotal commands: ", tc - prog_mem.count("!"))
  110.     print("total steps: ", steps)
  111.     print("bracket nesting levels: ", nesting_levels)
  112.     print("total bracket pairs: ", bracket_counter)
  113.     print("parenthesis nesting levels: ", paren_nesting_levels)
  114.     print("total parenthesis pairs: ", paren_counter)
  115.     print("number of functions: ", number_of_functions)
  116.  
  117. f = open(input("file name:"), 'r')
  118.  
  119. while True:
  120.    nextch = f.read(1)
  121.    if(not nextch):
  122.        f.close()
  123.        break
  124.  
  125.    if(nextch in command_set):
  126.        prog_mem += (nextch)
  127.  
  128. tc = len(prog_mem)
  129.  
  130. #Pre-Processing#################################################
  131. #print(prog_mem)
  132. ####################Brackets####################################
  133. # check bracket integrity
  134. for i in range(tc):
  135.     if(prog_mem[i] == "["):
  136.         bc_counter += 1
  137.         nesting_levels = max(bc_counter, nesting_levels)
  138.     elif(prog_mem[i] == "]"):
  139.         bc_counter -= 1
  140.     if(bc_counter < 0):
  141.         print("Grawlix Error: Bracket mismatch")
  142.         quit()
  143. if(bc_counter != 0):
  144.    print("Grawlix Error: Bracket mismatch")
  145.    quit()
  146. # calculate bracket locations
  147. for i in range(tc):
  148.    if(prog_mem[i] == '['):
  149.        top += 1
  150.        stack[top] = i
  151.    elif(prog_mem[i] == ']'):
  152.        close_bracket[bracket_counter] = i
  153.        open_bracket[bracket_counter] = stack[top]
  154.        top -= 1
  155.        bracket_counter += 1
  156. # print out arrays of open/close bracket locations (debugging)
  157. '''
  158. for i in range(bracket_counter):
  159.   print(i, ": ", open_bracket[i], close_bracket[i])
  160. '''
  161.  
  162. ###################Parenthesis##################################
  163. # check parenthesis integrity
  164. for i in range(tc):
  165.     if(prog_mem[i] == "("):
  166.         paren_check_counter += 1
  167.         paren_nesting_levels = max(paren_check_counter, paren_nesting_levels)
  168.     elif(prog_mem[i] == ")"):
  169.         paren_check_counter -= 1
  170.     if(paren_check_counter < 0):
  171.         print("Grawlix Error: Parenthesis mismatch")
  172.         quit()
  173. if(paren_check_counter != 0):
  174.    print("Grawlix Error: Parenthesis mismatch")
  175.    quit()
  176. # calculate parenthesis locations
  177. for i in range(tc):
  178.    if(prog_mem[i] == '('):
  179.        top += 1
  180.        stack[top] = i
  181.    elif(prog_mem[i] == ')'):
  182.        close_paren[paren_counter] = i
  183.        open_paren[paren_counter] = stack[top]
  184.        top -= 1
  185.        paren_counter += 1
  186. # print out arrays of open/close parenthesis locations (debugging)
  187. '''
  188. for i in range(paren_counter):
  189.   print(i, ": ", open_paren[i], close_paren[i])
  190. '''
  191. ###################Functions####################################
  192. # check function integrity
  193. for i in range(tc):
  194.     if(prog_mem[i] == "{"):
  195.         number_of_functions += 1
  196.         brace_check_counter += 1
  197.         brace_nesting_levels = max(brace_check_counter, brace_nesting_levels)
  198.     elif(prog_mem[i] == "}"):
  199.         brace_check_counter -= 1
  200.     if(brace_check_counter < 0):
  201.         print("Grawlix Error: Brace mismatch")
  202.         quit()
  203. if(brace_check_counter != 0):
  204.    print("Grawlix Error: Parenthesis mismatch")
  205.    quit()
  206. # calculate function locations
  207. for i in range(tc):
  208.    if(prog_mem[i] == '{'):
  209.        top += 1
  210.        stack[top] = i
  211.    elif(prog_mem[i] == '}'):
  212.        close_brace[brace_counter] = i
  213.        open_brace[brace_counter] = stack[top]
  214.        top -= 1
  215.        brace_counter += 1
  216. # print out open/close brace arrays (debugging)
  217.  
  218. for i in range(brace_counter):
  219.    print(i, ": ", open_brace[i], close_brace[i])
  220.  
  221. # run program  #################################################
  222. while(pc < len(prog_mem)):
  223.     if(prog_mem[pc] == "+"):
  224.         data_mem[p] = (data_mem[p] + 1) % 256
  225.         pc += 1
  226.         steps += 1
  227.  
  228.     elif(prog_mem[pc] == "-"):
  229.         data_mem[p] = (data_mem[p] - 1) % 256
  230.         pc    += 1
  231.         steps += 1
  232.  
  233.     elif(prog_mem[pc] == ">"):
  234.         p     += 1
  235.         high_p = max(p, high_p)
  236.         pc    += 1
  237.         steps += 1
  238.  
  239.     elif(prog_mem[pc] == "<"):
  240.         p     -= 1
  241.         if(p < 0):
  242.             print("Grawlix Error: Data Pointer Underflow")
  243.             quit()
  244.         pc    += 1
  245.         steps += 1
  246.  
  247.     elif(prog_mem[pc] == "."):
  248.         if(printable(data_mem[p])):
  249.             print(chr(data_mem[p]), end = "")
  250.         pc    += 1
  251.         steps += 1
  252.  
  253. # enter one char at a time, or several
  254. # they will be used as needed
  255. # use one more prompt to enter (cr) for EOF
  256.     elif(prog_mem[pc] == ","):
  257.         if(input_buffer == ""):
  258.             input_buffer = input(": ")
  259.         if(input_buffer == ""):# still empty - (cr) entered
  260.             data_mem[p] = 0
  261.         else:
  262.             key_press = input_buffer[0]
  263.             input_buffer = input_buffer[1:]
  264.             data_mem[p] = ord(key_press)
  265.         pc    += 1
  266.         steps += 1
  267.  
  268.     elif(prog_mem[pc] == "["):
  269.         steps += 1
  270.         if(data_mem[p] == 0):
  271.             pc = close_bracket[open_bracket.index(pc)] + 1
  272.         else:
  273.             pc += 1
  274.  
  275.     elif(prog_mem[pc] == "]"):
  276.         steps += 1
  277.         pc = open_bracket[close_bracket.index(pc)]
  278.  
  279. # Grawlix commands #############################################
  280.     elif(prog_mem[pc] == "|"):# left shift
  281.         data_mem[p] = (data_mem[p] << 1) % 256
  282.         pc += 1
  283.         steps += 1
  284.  
  285.     elif(prog_mem[pc] == "/"):# right shift
  286.         data_mem[p] = data_mem[p] >> 1
  287.         pc += 1
  288.         steps += 1
  289.  
  290.     elif(prog_mem[pc] == ":"):# push
  291.         stack[top] = data_mem[p]
  292.         top += 1
  293.         top_max = max(top, top_max)
  294.         pc += 1
  295.         steps += 1
  296.  
  297.     elif(prog_mem[pc] == ";"):# pop
  298.         top -= 1
  299.         if(top < 0):
  300.             print("Grawlix Error: Stack Underflow")
  301.             quit()
  302.         data_mem[p] = stack[top]
  303.         pc += 1
  304.         steps += 1
  305.  
  306.     elif(prog_mem[pc] == "?"):# input decimal number
  307.         data_mem[p] = int(input("Enter Decimal Number: ")) % 256
  308.         pc += 1
  309.         steps += 1
  310.  
  311.     elif(prog_mem[pc] == "="):# output decimal number
  312.         print('{:03d}'.format(data_mem[p]), end = "")
  313.         pc += 1
  314.         steps += 1
  315.    
  316.     elif(prog_mem[pc] == "^"):# stop
  317.         print("\nGrawlix Command Stop")
  318.         pc += 1
  319.         steps += 1
  320.         dump(p)
  321.         prog_data()
  322.         quit()
  323.  
  324.     elif(prog_mem[pc] == "("):
  325.         steps += 1
  326.         if(data_mem[p] == 0):
  327.             pc += 1
  328.         else:
  329.             pc = close_paren[open_paren.index(pc)] + 1
  330.  
  331.     elif(prog_mem[pc] == ")"):
  332.         steps += 1
  333.         pc = open_paren[close_paren.index(pc)]
  334.    
  335.     elif(prog_mem[pc] == "{"):# skip function code
  336.         pc = close_brace[open_brace.index(pc)] + 1
  337.         steps += 1
  338.    
  339.     elif(prog_mem[pc] == "}"):
  340.         function_return_top -= 1
  341.         pc = function_return_stack[function_return_top]
  342.         steps += 1
  343.    
  344.     elif(prog_mem[pc] == "@"):
  345.         steps += 1
  346.         function_return_stack[function_return_top] = pc + 1
  347.         function_return_top += 1
  348.         top -= 1
  349.         function_call_number = stack[top]
  350.         if(function_call_number > (number_of_functions - 1)):
  351.             print("Grawlix Error: No Function", function_call_number)
  352.             quit()
  353.         else:
  354.             pc = open_brace[function_call_number] + 1
  355.  
  356.     elif(prog_mem[pc] == "!"):
  357.         pc += 1
  358.         dump(p)
  359.    
  360.     elif(prog_mem[pc] == "#"):
  361.         pc += 1
  362.         dump(p)
  363.         temp = input("Pause")
  364.        
  365. # print out program data
  366. prog_data()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement