From 7094142f27e3b6ebb5a69f7d4db1859a1ea38503 Mon Sep 17 00:00:00 2001 From: Jean Dubois Date: Mon, 21 Mar 2022 13:24:14 +0100 Subject: [PATCH] fix all annoying bugs + alpha !!! * Better error messages (it's been a long time :rofl: ) * Does not crash when error in multiple line statements --- example.noug | 12 ++++++------ shell.py | 2 +- src/nodes.py | 2 +- src/nougaro.py | 2 +- src/parser.py | 38 ++++++++++++++++++++++++-------------- src/position.py | 3 +++ src/tokens.py | 2 +- version.json | 3 ++- 8 files changed, 39 insertions(+), 25 deletions(-) diff --git a/example.noug b/example.noug index 0335101..c082cb5 100644 --- a/example.noug +++ b/example.noug @@ -1,4 +1,4 @@ -# This file was made in nougaro-prototype-1 version. +# This file was made in nougaro alpha 0.1 version. # This is a comment # Basics : @@ -11,12 +11,12 @@ print(3-4) print(2*3) print(6/2) print(3^2) -print(|-5|) +print(abs(-5)) # Variables -var sometext = "Hello, world!" +var some_text = "Hello, world!" var a = var b = 3 -print(sometext); print(a * b) +print(some_text); print(a * b) print(noug_version) print(None) @@ -25,7 +25,7 @@ print("this is a string quoted by \".") print("You can put\nbacklines and\n\ttabs.") print("You can add \\ backslashes and \" \' quotes") -print("You can additionate and multiply strings : " + 3*sometext) +print("You can add up and multiply strings: " + 3*some_text) # Tests var name = input("Whats your name? ") @@ -67,7 +67,7 @@ def fib(n) end end -print(fib(input_int("Enter number:"))) +print(fib(input_int("Enter number: "))) var a = def()->print("Hello, world!") a() diff --git a/shell.py b/shell.py index 270d4da..9b74a56 100644 --- a/shell.py +++ b/shell.py @@ -43,7 +43,7 @@ with open("version.json") as ver_json: ver_json_loaded = json.load(ver_json) - version = ver_json_loaded.get("noug_version") + version = ver_json_loaded.get("phase") + " " + ver_json_loaded.get("noug_version") if path == "": print(f"Welcome to Nougaro {version}! Contribute : https://github.com/jd-develop/nougaro/") diff --git a/src/nodes.py b/src/nodes.py index 1093d42..7ed2b72 100644 --- a/src/nodes.py +++ b/src/nodes.py @@ -222,7 +222,7 @@ def __init__(self, node_to_call, arg_nodes: list): self.pos_end = self.node_to_call.pos_end def __repr__(self): - return f'(call:{self.node_to_call})' + return f'(call:{self.node_to_call}, arg_nodes:{self.arg_nodes})' class ReturnNode: diff --git a/src/nougaro.py b/src/nougaro.py index 97db5f7..6421fcf 100644 --- a/src/nougaro.py +++ b/src/nougaro.py @@ -27,7 +27,7 @@ with open("version.json") as ver_json: ver_json_loaded = json.load(ver_json) - version_ = ver_json_loaded.get("noug_version") + version_ = ver_json_loaded.get("phase") + " " + ver_json_loaded.get("noug_version") # ########## diff --git a/src/parser.py b/src/parser.py index f20931f..b3a48b9 100644 --- a/src/parser.py +++ b/src/parser.py @@ -10,7 +10,7 @@ from src.parse_result import ParseResult from src.nodes import * # src.tokens.Token is imported in src.nodes # built-in python imports -# no imports +from typing import Any, Union # ########## @@ -53,7 +53,9 @@ def update_current_token(self): # GRAMMARS ATOMS (AST) : - def statements(self): + def statements(self, stop: list[Union[tuple[str, Any], str]] = None) -> ParseResult: + if stop is None: + stop = [TT_EOF] result = ParseResult() statements = [] pos_start = self.current_token.pos_start.copy() @@ -81,13 +83,20 @@ def statements(self): if newline_count == 0: more_statements = False - if not more_statements: + have_to_break = False + for e in stop: + if isinstance(e, tuple): + if not more_statements or self.current_token.matches(*e): + have_to_break = True + else: + if not more_statements or self.current_token.type == e: + have_to_break = True + if have_to_break: break - statement = result.try_register(self.statement()) - if statement is None: - self.reverse(result.to_reverse_count) - more_statements = False - continue + + statement = result.register(self.statement()) + if result.error is not None: + return result statements.append(statement) return result.success(ListNode( @@ -450,7 +459,7 @@ def if_expr_c(self): result.register_advancement() self.advance() - statements = result.register(self.statements()) + statements = result.register(self.statements(stop=[(TT_KEYWORD, 'end')])) if result.error is not None: return result else_case = (statements, True) @@ -517,7 +526,8 @@ def if_expr_cases(self, case_keyword): result.register_advancement() self.advance() - statements = result.register(self.statements()) + statements = result.register(self.statements(stop=[(TT_KEYWORD, 'elif'), (TT_KEYWORD, 'else'), + (TT_KEYWORD, 'end')])) if result.error is not None: return result cases.append((condition, statements, True)) @@ -592,7 +602,7 @@ def for_expr(self): result.register_advancement() self.advance() - body = result.register(self.statements()) + body = result.register(self.statements(stop=[(TT_KEYWORD, 'end')])) if result.error is not None: return result @@ -662,7 +672,7 @@ def for_expr(self): result.register_advancement() self.advance() - body = result.register(self.statements()) + body = result.register(self.statements(stop=[(TT_KEYWORD, 'end')])) if result.error is not None: return result @@ -708,7 +718,7 @@ def while_expr(self): result.register_advancement() self.advance() - body = result.register(self.statements()) + body = result.register(self.statements(stop=[(TT_KEYWORD, 'end')])) if result.error is not None: return result @@ -844,7 +854,7 @@ def func_def(self): result.register_advancement() self.advance() - body = result.register(self.statements()) + body = result.register(self.statements(stop=[(TT_KEYWORD, 'end')])) if result.error is not None: return result diff --git a/src/position.py b/src/position.py index 416963d..61ad1b4 100644 --- a/src/position.py +++ b/src/position.py @@ -27,5 +27,8 @@ def advance(self, current_char=None): return self + def __repr__(self): + return f"Position at index {self.index} line {self.line_number} colon {self.colon}, in file {self.file_name}." + def copy(self): return Position(self.index, self.line_number, self.colon, self.file_name, self.file_txt) diff --git a/src/tokens.py b/src/tokens.py index 5ceef2e..1e5a942 100644 --- a/src/tokens.py +++ b/src/tokens.py @@ -18,7 +18,7 @@ def __init__(self, type_, value=None, pos_start=None, pos_end=None): self.pos_end = pos_start.copy() self.pos_end.advance() if pos_end is not None: - self.pos_end = pos_end + self.pos_end = pos_end.copy() def __repr__(self) -> str: if self.value: diff --git a/version.json b/version.json index be731b6..732e9d3 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,5 @@ { - "noug_version": "prototype-2", + "noug_version": "0.1", + "phase": "alpha", "inherit": true }