file imports work!!!!!
This commit is contained in:
@@ -5,8 +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, PrefixExpression
|
||||
from AST import BreakStatement, ContinueStatement, ForStatement
|
||||
from AST import InfixExpression, CallExpression, PrefixExpression, PostfixExpression
|
||||
from AST import BreakStatement, ContinueStatement, ForStatement, DependStatement
|
||||
from AST import IntegerLiteral, FloatLiteral, IdentifierLiteral, BooleanLiteral, StringLiteral
|
||||
from AST import FunctionParameter
|
||||
|
||||
@@ -34,7 +34,10 @@ PRECEDENCES: dict[TokenType, PrecedenceType] = {
|
||||
TokenType.GT: PrecedenceType.P_LESSGREATER,
|
||||
TokenType.LT_EQ: PrecedenceType.P_LESSGREATER,
|
||||
TokenType.GT_EQ: PrecedenceType.P_LESSGREATER,
|
||||
TokenType.DOLLARSIGN: PrecedenceType.P_CALL
|
||||
TokenType.DOLLARSIGN: PrecedenceType.P_CALL,
|
||||
|
||||
TokenType.PLUS_PLUS: PrecedenceType.P_INDEX,
|
||||
TokenType.MINUS_MINUS: PrecedenceType.P_INDEX
|
||||
}
|
||||
|
||||
class Parser:
|
||||
@@ -76,6 +79,10 @@ class Parser:
|
||||
TokenType.GT: self.__parse_infix_expression,
|
||||
TokenType.LT_EQ: self.__parse_infix_expression,
|
||||
TokenType.GT_EQ: self.__parse_infix_expression,
|
||||
|
||||
|
||||
TokenType.PLUS_PLUS: self.__parse_postfix_expression,
|
||||
TokenType.MINUS_MINUS: self.__parse_postfix_expression
|
||||
|
||||
}
|
||||
|
||||
@@ -158,6 +165,8 @@ class Parser:
|
||||
return self.__parse_continue_statement()
|
||||
case TokenType.FOR:
|
||||
return self.__parse_for_statement()
|
||||
case TokenType.DEPEND:
|
||||
return self.__parse_depend_statement()
|
||||
case _:
|
||||
return self.__parse_expression_statement()
|
||||
|
||||
@@ -372,9 +381,7 @@ class Parser:
|
||||
|
||||
self.__next_token() # skip ;
|
||||
|
||||
stmt.action = self.__parse_assignment_statement()
|
||||
|
||||
|
||||
stmt.action = self.__parse_expression(PrecedenceType.P_LOWEST)
|
||||
|
||||
self.__next_token()
|
||||
|
||||
@@ -384,6 +391,17 @@ class Parser:
|
||||
stmt.body = self.__parse_block_statement()
|
||||
|
||||
return stmt
|
||||
|
||||
def __parse_depend_statement(self) -> DependStatement:
|
||||
if not self.__expect_peek(TokenType.STRING):
|
||||
return None
|
||||
|
||||
stmt: DependStatement = DependStatement(self.current_token.literal)
|
||||
|
||||
if not self.__expect_peek(TokenType.SEMICOLON):
|
||||
return None
|
||||
|
||||
return stmt
|
||||
# endregion
|
||||
|
||||
# region Expression Methods
|
||||
@@ -393,9 +411,9 @@ class Parser:
|
||||
self.__no_prefix_parse_function_error(self.current_token.type)
|
||||
return None
|
||||
|
||||
|
||||
left_expr: Expression = prefix_func()
|
||||
while not self.__peek_token_is(TokenType.SEMICOLON) and precedence.value < self.__peek_precedence().value:
|
||||
|
||||
infix_func: Callable | None = self.infix_parse_functions.get(self.peek_token.type)
|
||||
if infix_func is None:
|
||||
return left_expr
|
||||
@@ -403,6 +421,7 @@ class Parser:
|
||||
self.__next_token()
|
||||
|
||||
left_expr = infix_func(left_expr)
|
||||
|
||||
|
||||
return left_expr
|
||||
|
||||
@@ -457,6 +476,9 @@ class Parser:
|
||||
prefix_expr.right_node = self.__parse_expression(PrecedenceType.P_PREFIX)
|
||||
|
||||
return prefix_expr
|
||||
|
||||
def __parse_postfix_expression(self, left_node: Expression) -> PostfixExpression:
|
||||
return PostfixExpression(left_node, self.current_token.literal)
|
||||
# endregion
|
||||
|
||||
# region Prefix Methods
|
||||
|
||||
Reference in New Issue
Block a user