parser: move parenthesized expression handling to a dedicated function
This commit is contained in:
parent
275728a635
commit
9463af0014
1 changed files with 19 additions and 7 deletions
|
|
@ -107,10 +107,8 @@ class Parser:
|
||||||
|
|
||||||
@tracer.trace_method
|
@tracer.trace_method
|
||||||
def factor(self, mandatory: bool = False) -> Value:
|
def factor(self, mandatory: bool = False) -> Value:
|
||||||
if self.accept(Tokens.Parens_Left):
|
if par_expression := self.parenthesized_expression(mandatory=False):
|
||||||
v = self.expression(mandatory=True)
|
return par_expression
|
||||||
self.expect(Tokens.Parens_Right)
|
|
||||||
return v
|
|
||||||
elif num := self.number(mandatory=False):
|
elif num := self.number(mandatory=False):
|
||||||
return num
|
return num
|
||||||
elif call := self.call(mandatory=False):
|
elif call := self.call(mandatory=False):
|
||||||
|
|
@ -172,17 +170,31 @@ class Parser:
|
||||||
elif mandatory:
|
elif mandatory:
|
||||||
raise UnexpectedTokenError(self.token, "definition")
|
raise UnexpectedTokenError(self.token, "definition")
|
||||||
|
|
||||||
|
@tracer.trace_method
|
||||||
|
def parenthesized_expression(self, mandatory: bool = False):
|
||||||
|
if lparens := self.accept(Tokens.Parens_Left):
|
||||||
|
expression = self.expression(mandatory=True)
|
||||||
|
rparens = self.expect(Tokens.Parens_Right)
|
||||||
|
expression.pseudo_nodes = [PseudoNode(lparens), PseudoNode(rparens)]
|
||||||
|
return expression
|
||||||
|
elif mandatory:
|
||||||
|
raise UnexpectedTokenError(self.token, "parenthesized expression")
|
||||||
|
|
||||||
@tracer.trace_method
|
@tracer.trace_method
|
||||||
def expression(self, mandatory: bool = False) -> Value:
|
def expression(self, mandatory: bool = False) -> Value:
|
||||||
|
node: Node | None = None
|
||||||
if self.peek(Tokens.KwLet) and (definition := self.definition(mandatory)):
|
if self.peek(Tokens.KwLet) and (definition := self.definition(mandatory)):
|
||||||
return Expression(definition)
|
node = definition
|
||||||
elif self.peek_several(Tokens.Identifier, Tokens.Equal) and (assignment := self.assignment(mandatory)):
|
elif self.peek_several(Tokens.Identifier, Tokens.Equal) and (assignment := self.assignment(mandatory)):
|
||||||
return Expression(assignment)
|
node = assignment
|
||||||
elif summation := self.summation(mandatory):
|
elif summation := self.summation(mandatory):
|
||||||
return Expression(summation)
|
node = summation
|
||||||
elif mandatory:
|
elif mandatory:
|
||||||
raise UnexpectedTokenError(self.token, "expression")
|
raise UnexpectedTokenError(self.token, "expression")
|
||||||
|
|
||||||
|
if node is not None:
|
||||||
|
return Expression(node)
|
||||||
|
|
||||||
@tracer.trace_method
|
@tracer.trace_method
|
||||||
def statement(self, mandatory: bool = False) -> Statement:
|
def statement(self, mandatory: bool = False) -> Statement:
|
||||||
if lbrace := self.accept(Tokens.Brace_Left):
|
if lbrace := self.accept(Tokens.Brace_Left):
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue