You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
45 lines
1.4 KiB
45 lines
1.4 KiB
#!/usr/bin/env python3
|
|
import json
|
|
import sys
|
|
tokens = dict()
|
|
program = './ast.json'
|
|
if len(sys.argv) > 1:
|
|
program = sys.argv[1]
|
|
with open(program, 'r') as json_tokens:
|
|
tokens = json.loads(json_tokens.read())
|
|
|
|
def throw(token: dict, message):
|
|
print("{} on line {} ".format(message, token['line_number']))
|
|
print("\033[4m" + token['value'] + "\033[0m")
|
|
sys.exit(1)
|
|
|
|
def parse_expression(params, expression):
|
|
split_on_space = expression.split(" ")
|
|
if len(split_on_space) == 1:
|
|
for param in params:
|
|
if param['signifier'] == expression and param['type'] == 'string':
|
|
return param['expression']
|
|
else:
|
|
return "Unknown"
|
|
|
|
|
|
for token in tokens:
|
|
if token['variant'] == "syntax_error":
|
|
throw(token, "Syntax error")
|
|
if token['variant'] == "function_call":
|
|
args = token['params']
|
|
function = token['function']
|
|
params = function['params']
|
|
if len(args) != len(params):
|
|
throw(token, "Wrong number of arguments")
|
|
for index in range(0, len(args)):
|
|
if args[index]['type'] != params[index]['type']:
|
|
throw(token, "Type missmatch on arguments")
|
|
signifier = params[index]['name']
|
|
params[index] = args[index]
|
|
params[index]['signifier'] = signifier
|
|
for part in function['body']:
|
|
if part['type'] == "stdout":
|
|
print(parse_expression(params, part['expression']))
|
|
|