if statements work
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, AssignmentStatement, FunctionStatement, ReturnStatement, BlockStatement, ReassignStatement
|
||||
from AST import ExpressionStatement, AssignmentStatement, FunctionStatement, ReturnStatement, BlockStatement, ReassignStatement, IfStatement
|
||||
from AST import InfixExpression
|
||||
from AST import IntegerLiteral, FloatLiteral, IdentifierLiteral
|
||||
from AST import IntegerLiteral, FloatLiteral, IdentifierLiteral, BooleanLiteral
|
||||
|
||||
class PrecedenceType(Enum):
|
||||
P_LOWEST = 0
|
||||
@@ -25,7 +25,13 @@ PRECEDENCES: dict[TokenType, PrecedenceType] = {
|
||||
TokenType.ASTERISK: PrecedenceType.P_PRODUCT,
|
||||
TokenType.SLASH: PrecedenceType.P_PRODUCT,
|
||||
TokenType.MODULUS: PrecedenceType.P_PRODUCT,
|
||||
TokenType.POW: PrecedenceType.P_EXPONENT
|
||||
TokenType.POW: PrecedenceType.P_EXPONENT,
|
||||
TokenType.EQ_EQ: PrecedenceType.P_EQUALS,
|
||||
TokenType.NOT_EQ: PrecedenceType.P_EQUALS,
|
||||
TokenType.LT: PrecedenceType.P_LESSGREATER,
|
||||
TokenType.GT: PrecedenceType.P_LESSGREATER,
|
||||
TokenType.LT_EQ: PrecedenceType.P_LESSGREATER,
|
||||
TokenType.GT_EQ: PrecedenceType.P_LESSGREATER
|
||||
}
|
||||
|
||||
class Parser:
|
||||
@@ -38,22 +44,27 @@ class Parser:
|
||||
self.peek_token: Token = None
|
||||
|
||||
self.prefix_parse_functions: dict[Token, Callable] = { # -1
|
||||
|
||||
TokenType.IDENT: self.__parse_identifier,
|
||||
TokenType.INT: self.__parse_int_literal,
|
||||
TokenType.FLOAT: self.__parse_float_literal,
|
||||
TokenType.LPAREN: self.__parse_grouped_expression
|
||||
|
||||
TokenType.LPAREN: self.__parse_grouped_expression,
|
||||
TokenType.IF: self.__parse_if_statement,
|
||||
TokenType.TRUE: self.__parse_boolean,
|
||||
TokenType.FALSE: self.__parse_boolean,
|
||||
}
|
||||
self.infix_parse_functions: dict[Token, Callable] = { # 5 + 5
|
||||
|
||||
TokenType.PLUS: self.__parse_infix_expression,
|
||||
TokenType.MINUS: self.__parse_infix_expression,
|
||||
TokenType.SLASH: self.__parse_infix_expression,
|
||||
TokenType.ASTERISK: self.__parse_infix_expression,
|
||||
TokenType.POW: self.__parse_infix_expression,
|
||||
TokenType.MODULUS: self.__parse_infix_expression
|
||||
|
||||
TokenType.MODULUS: self.__parse_infix_expression,
|
||||
TokenType.EQ_EQ: self.__parse_infix_expression,
|
||||
TokenType.NOT_EQ: self.__parse_infix_expression,
|
||||
TokenType.LT: self.__parse_infix_expression,
|
||||
TokenType.GT: self.__parse_infix_expression,
|
||||
TokenType.LT_EQ: self.__parse_infix_expression,
|
||||
TokenType.GT_EQ: self.__parse_infix_expression,
|
||||
}
|
||||
|
||||
self.__next_token()
|
||||
@@ -229,6 +240,30 @@ class Parser:
|
||||
self.__next_token()
|
||||
|
||||
return block_stmt
|
||||
|
||||
def __parse_if_statement(self) -> IfStatement:
|
||||
condition: Expression = None
|
||||
consequence: BlockStatement = None
|
||||
alternative: BlockStatement = None
|
||||
|
||||
self.__next_token()
|
||||
|
||||
condition = self.__parse_expression(PrecedenceType.P_LOWEST)
|
||||
|
||||
if not self.__expect_peek(TokenType.LBRACE):
|
||||
return None
|
||||
|
||||
consequence = self.__parse_block_statement()
|
||||
|
||||
if self.__peek_token_is(TokenType.UNLESS):
|
||||
self.__next_token()
|
||||
|
||||
if not self.__expect_peek(TokenType.LBRACE):
|
||||
return None
|
||||
|
||||
alternative = self.__parse_block_statement()
|
||||
|
||||
return IfStatement(condition, consequence, alternative)
|
||||
# endregion
|
||||
|
||||
# region Expression Methods
|
||||
@@ -297,4 +332,7 @@ class Parser:
|
||||
return None
|
||||
|
||||
return float_lit
|
||||
|
||||
def __parse_boolean(self) -> BooleanLiteral:
|
||||
return BooleanLiteral(value=self.__current_token_is(TokenType.TRUE))
|
||||
# endregion
|
||||
Reference in New Issue
Block a user