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 .lexer import Tokens, Token
from .logger import Logger, Tracer, LogLevel from .logger import Logger, Tracer, LogLevel
from .nodes import Float, Sum, Value, Product, Node, Division, Sub, Integer, Expression, Identifier, Assignment, \ 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__) logger = Logger(__name__)
tracer = Tracer(logger, level=LogLevel.Debug) tracer = Tracer(logger, level=LogLevel.Debug)
@ -141,9 +141,24 @@ class Parser:
elif mandatory: elif mandatory:
raise UnexpectedTokenError(self.token, "assignment") 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 @tracer.trace_method
def expression(self, mandatory: bool = False) -> Value: 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) return Expression(assignment)
elif summation := self.summation(mandatory): elif summation := self.summation(mandatory):
return Expression(summation) return Expression(summation)