file imports work!!!!!

This commit is contained in:
SpookyDervish
2025-10-18 07:21:19 +11:00
parent 24fcbb3fb7
commit 52686fa314
15 changed files with 210 additions and 73 deletions

View File

@@ -1,14 +1,18 @@
from llvmlite import ir
import os
from AST import Node, NodeType, Program, Expression
from AST import ExpressionStatement, AssignmentStatement, BlockStatement, ReturnStatement, FunctionStatement, ReassignStatement, IfStatement
from AST import WhileStatement, BreakStatement, ContinueStatement, ForStatement
from AST import InfixExpression, CallExpression, PrefixExpression
from AST import WhileStatement, BreakStatement, ContinueStatement, ForStatement, DependStatement
from AST import InfixExpression, CallExpression, PrefixExpression, PostfixExpression
from AST import IntegerLiteral, FloatLiteral, IdentifierLiteral, BooleanLiteral, StringLiteral
from AST import FunctionParameter
from environment import Environment
from lexer import Lexer
from plasma_parser import Parser
class Compiler:
def __init__(self) -> None:
@@ -36,6 +40,8 @@ class Compiler:
self.breakpoints: list[ir.Block] = []
self.continues: list[ir.Block] = []
self.global_parsed_pallets: dict[str, Program] = {}
def __initialize_builtins(self) -> None:
def __init_print() -> ir.Function:
fnty: ir.FunctionType = ir.FunctionType(
@@ -96,12 +102,16 @@ class Compiler:
self.__visit_continue_statement(node)
case NodeType.ForStatement:
self.__visit_for_statement(node)
case NodeType.DependStatement:
self.__visit_depend_statement(node)
# Expressions
case NodeType.InfixExpression:
self.__visit_infix_expression(node)
case NodeType.CallExpression:
self.__visit_call_expression(node)
case NodeType.PostfixExpression:
self.__visit_postfix_expression(node)
# region Visit Methods
def __visit_program(self, node: Program) -> None:
@@ -326,6 +336,30 @@ class Compiler:
self.breakpoints.pop()
self.continues.pop()
def __visit_depend_statement(self, node: DependStatement) -> None:
file_path: str = node.file_path
if self.global_parsed_pallets.get(file_path) is not None:
print(f"warning: \"{file_path}\" is already imported globally!\n")
return
with open(os.path.abspath(file_path), "r") as f:
pallet_code: str = f.read()
l: Lexer = Lexer(pallet_code)
p: Parser = Parser(l)
program: Program = p.parse_program()
if len(p.errors) > 0:
print(f"Error in dependency: {file_path}")
for err in p.errors:
print(err)
exit(1)
self.compile(program)
self.global_parsed_pallets[file_path] = program
# endregion
# region Expressions
@@ -455,6 +489,32 @@ class Compiler:
value = self.builder.not_(right_value)
return value, Type
def __visit_postfix_expression(self, node: PostfixExpression) -> None:
left_node: IdentifierLiteral = node.left_node
operator: str = node.operator
if self.environment.lookup(left_node.value) is None:
self.errors.append(f"Identifier {left_node.value} has not been declared before it was re-assigned.")
return
var_ptr, _ = self.environment.lookup(left_node.value)
orig_value = self.builder.load(var_ptr)
value = None
match operator:
case "++":
if isinstance(orig_value.type, ir.IntType):
value = self.builder.add(orig_value, ir.Constant(ir.IntType(32), 1))
elif isinstance(orig_value.type, ir.FloatType):
value = self.builder.fadd(orig_value, ir.Constant(ir.FloatType(), 1.0))
case "--":
if isinstance(orig_value.type, ir.IntType):
value = self.builder.sub(orig_value, ir.Constant(ir.IntType(32), 1))
elif isinstance(orig_value.type, ir.FloatType):
value = self.builder.fsub(orig_value, ir.Constant(ir.FloatType(), 1.0))
self.builder.store(value, var_ptr)
# endregion
# endregion