started work on assignment operators
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user