parser: parse definitions

let var: type
let var: type = value
This commit is contained in:
Antoine Viallon 2023-05-23 00:55:36 +02:00
parent 28ad2e2184
commit c2faff23e1
Signed by: aviallon
GPG key ID: D126B13AB555E16F

View file

@ -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)