started work on assignment operators

This commit is contained in:
SpookyDervish
2025-10-17 06:21:33 +11:00
parent 1d6c3db5e4
commit 24fcbb3fb7
10 changed files with 229 additions and 137 deletions

View File

@@ -5,7 +5,8 @@ from enum import Enum, auto
from AST import Statement, Expression, Program
from AST import ExpressionStatement, AssignmentStatement, FunctionStatement, ReturnStatement, BlockStatement, ReassignStatement, IfStatement, WhileStatement
from AST import InfixExpression, CallExpression, BreakStatement, ContinueStatement, ForStatement
from AST import InfixExpression, CallExpression, PrefixExpression
from AST import BreakStatement, ContinueStatement, ForStatement
from AST import IntegerLiteral, FloatLiteral, IdentifierLiteral, BooleanLiteral, StringLiteral
from AST import FunctionParameter
@@ -57,7 +58,10 @@ class Parser:
TokenType.STRING: self.__parse_string_literal,
TokenType.DOLLARSIGN: self.__parse_call_expression
TokenType.DOLLARSIGN: self.__parse_call_expression,
TokenType.MINUS: self.__parse_prefix_expression,
TokenType.BANG: self.__parse_prefix_expression,
}
self.infix_parse_functions: dict[Token, Callable] = { # 5 + 5
TokenType.PLUS: self.__parse_infix_expression,
@@ -89,6 +93,16 @@ class Parser:
def __peek_token_is(self, tt: TokenType) -> bool:
return self.peek_token.type == tt
def __peek_token_is_assignment(self) -> bool:
assignment_operators: list[TokenType] = [
TokenType.EQ,
TokenType.PLUS_EQ,
TokenType.MINUS_EQ,
TokenType.MUL_EQ,
TokenType.DIV_EQ,
]
return self.peek_token.type in assignment_operators
def __expect_peek(self, tt: TokenType) -> bool:
if self.__peek_token_is(tt):
self.__next_token()
@@ -161,12 +175,13 @@ class Parser:
# x: Int = 10;
stmt: AssignmentStatement = AssignmentStatement(name=IdentifierLiteral(self.current_token.literal))
if self.__peek_token_is(TokenType.EQ): # function definition
if self.__peek_token_is_assignment(): # function definition
# x = Func(): Int { return 10; }
self.__next_token()
if self.__peek_token_is(TokenType.TYPE):
if self.__current_token_is(TokenType.EQ) and self.__peek_token_is(TokenType.TYPE):
func_stmt: FunctionStatement = FunctionStatement(name=stmt.name)
if self.peek_token.literal != "Func":
@@ -197,9 +212,12 @@ class Parser:
else: # reassignment statement
assign_stmt: ReassignStatement = ReassignStatement()
assign_stmt.operator = self.current_token.literal
assign_stmt.ident = stmt.name
self.__next_token()
assign_stmt.ident = stmt.name
assign_stmt.right_value = self.__parse_expression(PrecedenceType.P_LOWEST)
@@ -430,6 +448,15 @@ class Parser:
return None
return e_list
def __parse_prefix_expression(self) -> PrefixExpression:
prefix_expr: PrefixExpression = PrefixExpression(operator=self.current_token.literal)
self.__next_token()
prefix_expr.right_node = self.__parse_expression(PrecedenceType.P_PREFIX)
return prefix_expr
# endregion
# region Prefix Methods