function arguments are getting added to the AST!

This commit is contained in:
SpookyDervish
2025-10-15 07:16:15 +11:00
parent 049db7c53a
commit 3c24b50a80
8 changed files with 123 additions and 25 deletions

View File

@@ -7,6 +7,7 @@ from AST import Statement, Expression, Program
from AST import ExpressionStatement, AssignmentStatement, FunctionStatement, ReturnStatement, BlockStatement, ReassignStatement, IfStatement
from AST import InfixExpression, CallExpression
from AST import IntegerLiteral, FloatLiteral, IdentifierLiteral, BooleanLiteral
from AST import FunctionParameter
class PrecedenceType(Enum):
P_LOWEST = 0
@@ -164,10 +165,9 @@ class Parser:
if not self.__expect_peek(TokenType.LPAREN):
return None
func_stmt.parameters = []
func_stmt.parameters = self.__parse_function_parameters()
if not self.__expect_peek(TokenType.RPAREN):
return None
if not self.__expect_peek(TokenType.COLON):
return None
@@ -217,6 +217,38 @@ class Parser:
return stmt
def __parse_function_parameters(self) -> list[FunctionParameter]:
params: list[FunctionParameter] = []
if self.__peek_token_is(TokenType.RPAREN):
self.__next_token()
return params
self.__next_token()
first_param: FunctionParameter = FunctionParameter(name=self.current_token.literal)
if not self.__expect_peek(TokenType.COLON):
return None
self.__next_token()
first_param.value_type = self.current_token.literal
params.append(first_param)
while self.__peek_token_is(TokenType.COMMA):
self.__next_token()
self.__next_token()
param: FunctionParameter = FunctionParameter(name=self.current_token.literal)
if not self.__expect_peek(TokenType.COLON):
return None
self.__next_token()
param.value_type = self.current_token.literal
params.append(param)
if not self.__expect_peek(TokenType.RPAREN):
return None
return params
def __parse_return_statement(self) -> ReturnStatement:
stmt: ReturnStatement = ReturnStatement()
@@ -311,12 +343,31 @@ class Parser:
def __parse_call_expression(self, function: Expression) -> CallExpression:
expr: CallExpression = CallExpression(function=function)
expr.arguments = [] # TODO
if not self.__expect_peek(TokenType.RPAREN):
return None
expr.arguments = self.__parse_expression_list(TokenType.RPAREN)
return expr
def __parse_expression_list(self, end: TokenType) -> list[Expression]:
e_list: list[Expression] = []
if self.__peek_token_is(end):
self.__next_token()
return e_list
self.__next_token()
e_list.append(self.__parse_expression(PrecedenceType.P_LOWEST))
while self.__peek_token_is(TokenType.COMMA):
self.__next_token()
self.__next_token()
e_list.append(self.__parse_expression(PrecedenceType.P_LOWEST))
if not self.__expect_peek(end):
return None
return e_list
# endregion
# region Prefix Methods