VARIABLESSSS

This commit is contained in:
SpookyDervish
2025-10-13 21:05:03 +11:00
parent 4e17674361
commit f9cd1dba29
17 changed files with 366 additions and 65 deletions

View File

@@ -4,9 +4,9 @@ from typing import Callable
from enum import Enum, auto
from AST import Statement, Expression, Program
from AST import ExpressionStatement
from AST import ExpressionStatement, AssignmentStatement
from AST import InfixExpression
from AST import IntegerLiteral, FloatLiteral
from AST import IntegerLiteral, FloatLiteral, IdentifierLiteral
class PrecedenceType(Enum):
P_LOWEST = 0
@@ -63,6 +63,9 @@ class Parser:
self.current_token = self.peek_token
self.peek_token = self.lexer.next_token()
def __current_token_is(self, tt: TokenType) -> bool:
return self.current_token.type == tt
def __peek_token_is(self, tt: TokenType) -> bool:
return self.peek_token.type == tt
@@ -108,7 +111,11 @@ class Parser:
# region Statement Methods
def __parse_statement(self) -> Statement:
return self.__parse_expression_statement()
match self.current_token.type:
case TokenType.IDENT:
return self.__parse_assignment_statement()
case _:
return self.__parse_expression_statement()
def __parse_expression_statement(self) -> ExpressionStatement:
expr = self.__parse_expression(PrecedenceType.P_LOWEST)
@@ -119,6 +126,30 @@ class Parser:
stmt: ExpressionStatement = ExpressionStatement(expr=expr)
return stmt
def __parse_assignment_statement(self) -> AssignmentStatement:
# x: Int = 10;
stmt: AssignmentStatement = AssignmentStatement(name=IdentifierLiteral(self.current_token.literal))
if not self.__expect_peek(TokenType.COLON):
return None
if not self.__expect_peek(TokenType.TYPE):
return None
stmt.value_type = self.current_token.literal
if not self.__expect_peek(TokenType.EQ):
return None
self.__next_token()
stmt.value = self.__parse_expression(PrecedenceType.P_LOWEST)
while not self.__current_token_is(TokenType.SEMICOLON) and not self.__current_token_is(TokenType.EOF):
self.__next_token()
return stmt
# endregion
# region Expression Methods