From ed7378090bb30779196771761774a9e4defa916d Mon Sep 17 00:00:00 2001 From: Micke Nordin Date: Wed, 8 Jun 2022 10:58:01 +0200 Subject: [PATCH] Add pass1 parser --- pass1.py | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100755 pass1.py diff --git a/pass1.py b/pass1.py new file mode 100755 index 0000000..b18f912 --- /dev/null +++ b/pass1.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python3 +import json +import operator +tokens = dict() +with open('./tokens.json', 'r') as json_tokens: + tokens = json.loads(json_tokens.read()) + +usefull_tokens = list() + +def peek(index: int) -> dict: + global tokens + result = dict() + if index < len(tokens): + result = tokens[index] + return result + +def find_token_indicies(key: str) -> list: + global tokens + result = list() + index = 0 + for token in tokens: + if token["value"] == key: + result.append(index) + index = index + 1 + return result + +def collect_body(index: int) -> list(): + result = list() + token = peek(index + 1) + if token['variant'] != "operator": + return result + maybe_expression = peek(index + 2) + if maybe_expression['variant'] == 'expression': + result.append(token) + return result + elif maybe_expression['variant'] == 'start_block': + index = index + 2 + while True: + index = index + 1 + collectable = peek(index) + if collectable['variant'] == 'end_block': + break + result.append(collectable) + + return result + + +for index in range(0, len(tokens)): + token = tokens[index] + + # This is a declaration + if token['variant'] == 'type': + maybe_signifier = peek(index + 2) + expression = '' + line_number = token['line_number'] + if maybe_signifier["variant"] == "signifier": + name = maybe_signifier['value'] + for i in find_token_indicies(name): + maybe_expression = peek(i + 2) + if maybe_expression['variant'] == 'expression': + line_number = maybe_expression['line_number'] + expression = maybe_expression['value'] + break + usefull_token = { "variant": "variable_declaration", "signifier": name, "type": token['value'], "line_number": line_number, "expression": expression } + usefull_tokens.append(usefull_token) + if token['variant'] == 'function_declaration': + body = collect_body(index) + usefull_token = { "variant": "function_declaration", "signifier": token['value'], "line_number": token['line_number'], "params": token['params'] ,"body": body} + + usefull_tokens.append(usefull_token) + +sorted_tokens = usefull_tokens.sort(key=operator.itemgetter('line_number')) +print(json.dumps(usefull_tokens))