diff --git a/compiler/__main__.py b/compiler/__main__.py index cb1da0d..936dbc8 100644 --- a/compiler/__main__.py +++ b/compiler/__main__.py @@ -1,19 +1,35 @@ from __future__ import annotations +import sys + +from .logger import rootLogger, LogLevel +from .parser import Parser, ParsingError from .tokenizer import Tokenizer, Tokens from .parser import Parser data = "2 * (32.9 + 1)" def main(): + data = """ + 2 + 3 / (8 - 1 + 3) * 1 + + 34.2 + """ tokenizer = Tokenizer() - tokens = tokenizer.tokenize("2 + 3") + tokens = tokenizer.tokenize(data) tokens = [token for token in tokens if token.kind not in [Tokens.Blank, Tokens.Newline]] print(tokens) parser = Parser(tokens) - parser.root() + try: + print(parser.parse()) + except ParsingError as e: + e.location.source = data + print(f"{e}\n{e.location.show_in_source()}", file=sys.stderr) + if e.__cause__ is not None: + if rootLogger.level <= LogLevel.Debug: + raise e.__cause__ + print(f"Caused by:\n{e.__cause__.__class__.__name__}: {e.__cause__}", file=sys.stderr) if __name__ == "__main__": diff --git a/compiler/parser.py b/compiler/parser.py index 5076764..94fdcda 100644 --- a/compiler/parser.py +++ b/compiler/parser.py @@ -103,5 +103,19 @@ class Parser: return summation def root(self): - self.expression() - self.expect(Tokens.EOF) + blocks = [ + self.expression(), + self.expect(Tokens.EOF), + ] + return blocks + + def parse(self) -> Node: + try: + return self.root() + except ParsingError: + raise + except Exception as e: + tok = self._last_accepted_token + if tok is None: + tok = self.token + raise ParsingError(tok.loc) from e