parser isnt liking for statements :(

This commit is contained in:
SpookyDervish
2025-10-16 07:24:40 +11:00
parent 9f6fff9977
commit 600bebb9b2
6 changed files with 153 additions and 11 deletions

View File

@@ -2,7 +2,7 @@ from llvmlite import ir
from AST import Node, NodeType, Program, Expression
from AST import ExpressionStatement, AssignmentStatement, BlockStatement, ReturnStatement, FunctionStatement, ReassignStatement, IfStatement
from AST import WhileStatement
from AST import WhileStatement, BreakStatement, ContinueStatement, ForStatement
from AST import InfixExpression, CallExpression
from AST import IntegerLiteral, FloatLiteral, IdentifierLiteral, BooleanLiteral, StringLiteral
from AST import FunctionParameter
@@ -33,6 +33,9 @@ class Compiler:
self.__initialize_builtins()
self.breakpoints: list[ir.Block] = []
self.continues: list[ir.Block] = []
def __initialize_builtins(self) -> None:
def __init_print() -> ir.Function:
fnty: ir.FunctionType = ir.FunctionType(
@@ -87,6 +90,12 @@ class Compiler:
self.__visit_if_statement(node)
case NodeType.WhileStatement:
self.__visit_while_statement(node)
case NodeType.BreakStatement:
self.__visit_break_statement(node)
case NodeType.ContinueStatement:
self.__visit_continue_statement(node)
case NodeType.ForStatement:
self.__visit_for_statement(node)
# Expressions
case NodeType.InfixExpression:
@@ -238,6 +247,44 @@ class Compiler:
test, _ = self.__resolve_value(condition)
self.builder.cbranch(test, while_loop_entry, while_loop_otherwise)
self.builder.position_at_start(while_loop_otherwise)
def __visit_break_statement(self, node: BreakStatement) -> None:
self.builder.branch(self.breakpoints[-1])
def __visit_continue_statement(self, node: ContinueStatement) -> None:
self.builder.branch[self.continues[-1]]
def __visit_for_statement(self, node: ForStatement) -> None:
var_declaration: AssignmentStatement = node.var_declaration
condition: Expression = node.condition
action: ReassignStatement = node.action
body: BlockStatement = node.body
previous_env = self.environment
self.environment = Environment(parent=previous_env)
self.compile(var_declaration)
for_loop_entry = self.builder.append_basic_block(f"for_loop_entry_{self.__increment_counter()}")
for_loop_otherwise = self.builder.append_basic_block(f"for_loop_otherwise_{self.counter}")
self.breakpoints.append(for_loop_otherwise)
self.continues.append(for_loop_entry)
self.builder.branch(for_loop_entry)
self.builder.position_at_start(for_loop_entry)
self.compile(body)
self.compile(action)
test, _ = self.__resolve_value(condition)
self.builder.cbranch(test, for_loop_entry, for_loop_otherwise)
self.builder.position_at_start(for_loop_otherwise)
self.breakpoints.pop()
self.continues.pop()
# endregion
# region Expressions