From c2faff23e19bf1feaaa58440ee768ff44b695d36 Mon Sep 17 00:00:00 2001 From: Antoine Viallon Date: Tue, 23 May 2023 00:55:36 +0200 Subject: [PATCH] parser: parse definitions let var: type let var: type = value --- compiler/parser.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/compiler/parser.py b/compiler/parser.py index 50907ec..92ec563 100644 --- a/compiler/parser.py +++ b/compiler/parser.py @@ -6,7 +6,7 @@ from .errors import CompilationError, UnexpectedTokenError from .lexer import Tokens, Token from .logger import Logger, Tracer, LogLevel from .nodes import Float, Sum, Value, Product, Node, Division, Sub, Integer, Expression, Identifier, Assignment, \ - Variable, Statement, PseudoNode, Block + Variable, Statement, PseudoNode, Block, Definition logger = Logger(__name__) tracer = Tracer(logger, level=LogLevel.Debug) @@ -141,9 +141,24 @@ class Parser: elif mandatory: raise UnexpectedTokenError(self.token, "assignment") + @tracer.trace_method + def definition(self, mandatory: bool = False) -> Definition: + if let_kw := self.accept(Tokens.KwLet): + ident = self.identifier(mandatory=True) + self.expect(Tokens.Colon) + type_ident = self.identifier(mandatory=True) + expr = None + if self.accept(Tokens.Equal): + expr = self.expression(mandatory=False) + return Definition(ident, type_ident, expr, PseudoNode(let_kw)) + elif mandatory: + raise UnexpectedTokenError(self.token, "definition") + @tracer.trace_method def expression(self, mandatory: bool = False) -> Value: - if self.peek_several(Tokens.Identifier, Tokens.Equal) and (assignment := self.assignment(mandatory)): + if self.peek(Tokens.KwLet) and (definition := self.definition(mandatory)): + return Expression(definition) + elif self.peek_several(Tokens.Identifier, Tokens.Equal) and (assignment := self.assignment(mandatory)): return Expression(assignment) elif summation := self.summation(mandatory): return Expression(summation)