parser: parse definitions
let var: type let var: type = value
This commit is contained in:
parent
28ad2e2184
commit
c2faff23e1
1 changed files with 17 additions and 2 deletions
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue