file imports work!!!!!
This commit is contained in:
64
compiler.py
64
compiler.py
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user