VARIABLESSSS
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user