parser: parse function calls
This commit is contained in:
parent
a092c11216
commit
ec1001bfd3
2 changed files with 23 additions and 4 deletions
|
|
@ -44,6 +44,7 @@ class Tokens(enum.Enum):
|
||||||
Equal = re.compile(r"=")
|
Equal = re.compile(r"=")
|
||||||
Colon = re.compile(r":")
|
Colon = re.compile(r":")
|
||||||
Semicolon = re.compile(r";")
|
Semicolon = re.compile(r";")
|
||||||
|
Comma = re.compile(r",")
|
||||||
|
|
||||||
Newline = re.compile(r"\n", flags=re.MULTILINE)
|
Newline = re.compile(r"\n", flags=re.MULTILINE)
|
||||||
EOF = re.compile(r"\Z")
|
EOF = re.compile(r"\Z")
|
||||||
|
|
|
||||||
|
|
@ -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, Definition
|
Variable, Statement, PseudoNode, Block, Definition, Call
|
||||||
|
|
||||||
logger = Logger(__name__)
|
logger = Logger(__name__)
|
||||||
tracer = Tracer(logger, level=LogLevel.Debug)
|
tracer = Tracer(logger, level=LogLevel.Debug)
|
||||||
|
|
@ -108,12 +108,14 @@ 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 self.accept(Tokens.Parens_Left):
|
||||||
v = self.expression()
|
v = self.expression(mandatory=True)
|
||||||
self.expect(Tokens.Parens_Right)
|
self.expect(Tokens.Parens_Right)
|
||||||
return v
|
return v
|
||||||
elif num := self.number():
|
elif num := self.number(mandatory=False):
|
||||||
return num
|
return num
|
||||||
elif variable := self.variable():
|
elif call := self.call(mandatory=False):
|
||||||
|
return call
|
||||||
|
elif variable := self.variable(mandatory=False):
|
||||||
return variable
|
return variable
|
||||||
elif mandatory:
|
elif mandatory:
|
||||||
raise UnexpectedTokenError(self.token, "parenthesized expression, number or variable")
|
raise UnexpectedTokenError(self.token, "parenthesized expression, number or variable")
|
||||||
|
|
@ -141,6 +143,22 @@ class Parser:
|
||||||
elif mandatory:
|
elif mandatory:
|
||||||
raise UnexpectedTokenError(self.token, "assignment")
|
raise UnexpectedTokenError(self.token, "assignment")
|
||||||
|
|
||||||
|
@tracer.trace_method
|
||||||
|
def call(self, mandatory: bool = False) -> Call:
|
||||||
|
if self.peek_several(Tokens.Identifier, Tokens.Parens_Left):
|
||||||
|
ident = self.identifier(mandatory=True)
|
||||||
|
lparens = self.expect(Tokens.Parens_Left)
|
||||||
|
expressions: list[Expression] = []
|
||||||
|
if expr := self.expression(mandatory=False):
|
||||||
|
expressions += [expr]
|
||||||
|
while self.accept(Tokens.Comma):
|
||||||
|
expressions += [self.expression(mandatory=True)]
|
||||||
|
rparens = self.expect(Tokens.Parens_Right)
|
||||||
|
return Call(identifier=ident, arguments=expressions,
|
||||||
|
pseudo_nodes=[PseudoNode(lparens), PseudoNode(rparens)])
|
||||||
|
elif mandatory:
|
||||||
|
raise UnexpectedTokenError(self.token, "function call")
|
||||||
|
|
||||||
@tracer.trace_method
|
@tracer.trace_method
|
||||||
def definition(self, mandatory: bool = False) -> Definition:
|
def definition(self, mandatory: bool = False) -> Definition:
|
||||||
if let_kw := self.accept(Tokens.KwLet):
|
if let_kw := self.accept(Tokens.KwLet):
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue