bf17 icon

Grawlix interpreter

bf17 | PRO | 10/16/17 05:05:13 AM UTC | 0 ⭐ | 691 👁️ | Never ⏰ | []
Python |

10.06 KB

|

None

|

0 👍

/

0 👎

# Pythonista 3.5
# Grawlix Programming Language
# Last update: 2017
 
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
top_max = 0 # highest value of top
tc = 0      # total command count
steps = 0   # number of execution steps
command_set = "><+-,.[];:?(){}@/|=^!#"
 
prog_mem = ""
nextch = ""
key_press = ""
input_buffer = ""
data_mem =      array('B')
data_mem =      [0] * 100000
stack =         array('I')
stack =         [0] * 100000
 
bracket_check = ""
bracket_counter = 0
bc_counter = 0   #bracket_check counter
nesting_levels = 0 # for brackets
open_bracket =  array('I')
open_bracket =  [0] * 100000
close_bracket = array('I')
close_bracket = [0] * 100000
 
paren_check =  ""
paren_counter = 0
paren_check_counter = 0
paren_nesting_levels = 0
open_paren =  array('I')
open_paren =  [0] * 100000
close_paren = array('I')
close_paren = [0] * 100000
 
brace_check =  ""
brace_counter = 0
brace_check_counter = 0
brace_nesting_levels = 0
function_call_number = 0
number_of_functions = 0
open_brace =  array('I')
open_brace =  [0] * 100000
close_brace = array('I')
close_brace = [0] * 100000
function_return_stack = array('I')
function_return_stack = [0] * 256
function_return_top = 0
 
# define functions
def printable(n):
   if((n>31 and n<127) or n == 10):
       return(True)
   else:
       return(False)
 
def find_open_bracket(x):
   return(open_bracket[close_bracket.index(x)])
 
def find_close_bracket(x):
   return(close_bracket[open_bracket.index(x)])
 
def find_open_paren(x):
   return(open_paren[close_paren.index(x)])
 
def find_close_paren(x):
   return(close_paren[open_paren.index(x)])
 
def find_open_brace(x):# functions
   return(open_brace[close_brace.index(x)])
 
def find_close_brace(x):
   return(close_brace[open_brace.index(x)])
 
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("|")
   #                 print out stack   
   if(top > 0):
       print()
       for i in range(top):
           print('{:03d}'.format(i), '{:03d}'.format(stack[i]))
 
def prog_data():
    print("\ntotal commands: ", tc - prog_mem.count("!"))
    print("total steps: ", steps)
    print("bracket nesting levels: ", nesting_levels)
    print("total bracket pairs: ", bracket_counter)
    print("parenthesis nesting levels: ", paren_nesting_levels)
    print("total parenthesis pairs: ", paren_counter)
    print("number of functions: ", number_of_functions)
 
f = open(input("file name:"), 'r')
 
while True:
   nextch = f.read(1)
   if(not nextch):
       f.close()
       break
 
   if(nextch in command_set):
       prog_mem += (nextch)
 
tc = len(prog_mem)
 
#Pre-Processing#################################################
#print(prog_mem)
####################Brackets####################################
# check bracket integrity
for i in range(tc):
    if(prog_mem[i] == "["):
        bc_counter += 1
        nesting_levels = max(bc_counter, nesting_levels)
    elif(prog_mem[i] == "]"):
        bc_counter -= 1
    if(bc_counter < 0):
        print("Grawlix Error: Bracket mismatch")
        quit()
if(bc_counter != 0):
   print("Grawlix Error: Bracket mismatch")
   quit()
# calculate bracket locations
for i in range(tc):
   if(prog_mem[i] == '['):
       top += 1
       stack[top] = i
   elif(prog_mem[i] == ']'):
       close_bracket[bracket_counter] = i
       open_bracket[bracket_counter] = stack[top]
       top -= 1
       bracket_counter += 1
# print out arrays of open/close bracket locations (debugging)
'''
for i in range(bracket_counter):
   print(i, ": ", open_bracket[i], close_bracket[i])
'''
 
###################Parenthesis##################################
# check parenthesis integrity
for i in range(tc):
    if(prog_mem[i] == "("):
        paren_check_counter += 1
        paren_nesting_levels = max(paren_check_counter, paren_nesting_levels)
    elif(prog_mem[i] == ")"):
        paren_check_counter -= 1
    if(paren_check_counter < 0):
        print("Grawlix Error: Parenthesis mismatch")
        quit()
if(paren_check_counter != 0):
   print("Grawlix Error: Parenthesis mismatch")
   quit()
# calculate parenthesis locations
for i in range(tc):
   if(prog_mem[i] == '('):
       top += 1
       stack[top] = i
   elif(prog_mem[i] == ')'):
       close_paren[paren_counter] = i
       open_paren[paren_counter] = stack[top]
       top -= 1
       paren_counter += 1
# print out arrays of open/close parenthesis locations (debugging)
'''
for i in range(paren_counter):
   print(i, ": ", open_paren[i], close_paren[i])
'''
###################Functions####################################
# check function integrity
for i in range(tc):
    if(prog_mem[i] == "{"):
        number_of_functions += 1
        brace_check_counter += 1
        brace_nesting_levels = max(brace_check_counter, brace_nesting_levels)
    elif(prog_mem[i] == "}"):
        brace_check_counter -= 1
    if(brace_check_counter < 0):
        print("Grawlix Error: Brace mismatch")
        quit()
if(brace_check_counter != 0):
   print("Grawlix Error: Parenthesis mismatch")
   quit()
# calculate function locations
for i in range(tc):
   if(prog_mem[i] == '{'):
       top += 1
       stack[top] = i
   elif(prog_mem[i] == '}'):
       close_brace[brace_counter] = i
       open_brace[brace_counter] = stack[top]
       top -= 1
       brace_counter += 1
# print out open/close brace arrays (debugging)
 
for i in range(brace_counter):
   print(i, ": ", open_brace[i], close_brace[i])
 
# run program  #################################################
while(pc < len(prog_mem)):
    if(prog_mem[pc] == "+"):
        data_mem[p] = (data_mem[p] + 1) % 256
        pc += 1
        steps += 1
 
    elif(prog_mem[pc] == "-"):
        data_mem[p] = (data_mem[p] - 1) % 256
        pc    += 1
        steps += 1
 
    elif(prog_mem[pc] == ">"):
        p     += 1
        high_p = max(p, high_p)
        pc    += 1
        steps += 1
 
    elif(prog_mem[pc] == "<"):
        p     -= 1
        if(p < 0):
            print("Grawlix Error: Data Pointer Underflow")
            quit()
        pc    += 1
        steps += 1
 
    elif(prog_mem[pc] == "."):
        if(printable(data_mem[p])):
            print(chr(data_mem[p]), end = "")
        pc    += 1
        steps += 1
 
# enter one char at a time, or several
# they will be used as needed
# use one more prompt to enter (cr) for EOF
    elif(prog_mem[pc] == ","):
        if(input_buffer == ""):
            input_buffer = input(": ")
        if(input_buffer == ""):# still empty - (cr) entered
            data_mem[p] = 0
        else:
            key_press = input_buffer[0]
            input_buffer = input_buffer[1:]
            data_mem[p] = ord(key_press)
        pc    += 1
        steps += 1
 
    elif(prog_mem[pc] == "["):
        steps += 1
        if(data_mem[p] == 0):
            pc = close_bracket[open_bracket.index(pc)] + 1
        else:
            pc += 1
 
    elif(prog_mem[pc] == "]"):
        steps += 1
        pc = open_bracket[close_bracket.index(pc)]
 
# Grawlix commands #############################################
    elif(prog_mem[pc] == "|"):# left shift
        data_mem[p] = (data_mem[p] << 1) % 256
        pc += 1
        steps += 1
 
    elif(prog_mem[pc] == "/"):# right shift
        data_mem[p] = data_mem[p] >> 1
        pc += 1
        steps += 1
 
    elif(prog_mem[pc] == ":"):# push
        stack[top] = data_mem[p]
        top += 1
        top_max = max(top, top_max)
        pc += 1
        steps += 1
 
    elif(prog_mem[pc] == ";"):# pop
        top -= 1
        if(top < 0):
            print("Grawlix Error: Stack Underflow")
            quit()
        data_mem[p] = stack[top]
        pc += 1
        steps += 1
 
    elif(prog_mem[pc] == "?"):# input decimal number
        data_mem[p] = int(input("Enter Decimal Number: ")) % 256
        pc += 1
        steps += 1
 
    elif(prog_mem[pc] == "="):# output decimal number
        print('{:03d}'.format(data_mem[p]), end = "")
        pc += 1
        steps += 1
    
    elif(prog_mem[pc] == "^"):# stop
        print("\nGrawlix Command Stop")
        pc += 1
        steps += 1
        dump(p)
        prog_data()
        quit()
 
    elif(prog_mem[pc] == "("):
        steps += 1
        if(data_mem[p] == 0):
            pc += 1
        else:
            pc = close_paren[open_paren.index(pc)] + 1
 
    elif(prog_mem[pc] == ")"):
        steps += 1
        pc = open_paren[close_paren.index(pc)]
    
    elif(prog_mem[pc] == "{"):# skip function code
        pc = close_brace[open_brace.index(pc)] + 1
        steps += 1
    
    elif(prog_mem[pc] == "}"):
        function_return_top -= 1
        pc = function_return_stack[function_return_top]
        steps += 1
    
    elif(prog_mem[pc] == "@"):
        steps += 1
        function_return_stack[function_return_top] = pc + 1
        function_return_top += 1
        top -= 1
        function_call_number = stack[top]
        if(function_call_number > (number_of_functions - 1)):
            print("Grawlix Error: No Function", function_call_number)
            quit()
        else:
            pc = open_brace[function_call_number] + 1
 
    elif(prog_mem[pc] == "!"):
        pc += 1
        dump(p)
    
    elif(prog_mem[pc] == "#"):
        pc += 1
        dump(p)
        temp = input("Pause")
        
# print out program data
prog_data()

Comments