From 5b3f0262a77cac70de2c4a35a80fd789081a3641 Mon Sep 17 00:00:00 2001 From: Antoine Viallon Date: Mon, 8 May 2023 20:30:51 +0200 Subject: [PATCH] parser: add UnexpectedTokenError --- compiler/parser.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/compiler/parser.py b/compiler/parser.py index 13e2ed5..8228751 100644 --- a/compiler/parser.py +++ b/compiler/parser.py @@ -16,6 +16,14 @@ class ParsingError(Exception): self.location = location +class UnexpectedTokenError(ParsingError): + def __init__(self, got: Token, wanted: Tokens | str): + message = wanted + if type(wanted) == Tokens: + message = str(wanted) + super().__init__(got.loc, f"Unexpected token '{got}', wanted {message}") + + class Parser: def __init__(self, tokens: List[Token]): self.tokens = tokens @@ -54,7 +62,7 @@ class Parser: r = self.accept(token_type) logger.debug(f"Expecting {token_type}, got {r}") if r is False: - raise ParsingError(self.token.loc, f"Unexpected token '{self.token}', wanted {token_type}") + raise UnexpectedTokenError(self.token, token_type) return r def number(self, mandatory: bool = False): @@ -65,7 +73,7 @@ class Parser: logger.debug(f"Found integer {tok}") return Integer(value=int(tok.value)) elif mandatory: - raise ParsingError(self.token.loc, f"Unexpected token '{self.token}', wanted integer or float") + raise UnexpectedTokenError(self.token, "integer or float") def binary_op(self, operand_func: Callable[[], Value], operators: Dict[Tokens, Value]): operand = operand_func() @@ -86,8 +94,7 @@ class Parser: elif num := self.number(): return num else: - raise ParsingError(self.token.loc, f"Unexpected token '{self.token}', wanted parenthesized expression or " - f"number") + raise UnexpectedTokenError(self.token, "parenthesized expression or number") def term(self) -> Value: return self.binary_op(self.factor, operators={