fixed reassignment, starting work on if statements
This commit is contained in:
16
compiler.py
16
compiler.py
@@ -1,7 +1,7 @@
|
||||
from llvmlite import ir
|
||||
|
||||
from AST import Node, NodeType, Program, Expression
|
||||
from AST import ExpressionStatement, AssignmentStatement, BlockStatement, ReturnStatement, FunctionStatement
|
||||
from AST import ExpressionStatement, AssignmentStatement, BlockStatement, ReturnStatement, FunctionStatement, ReassignStatement
|
||||
from AST import InfixExpression
|
||||
from AST import IntegerLiteral, FloatLiteral, IdentifierLiteral
|
||||
|
||||
@@ -23,6 +23,7 @@ class Compiler:
|
||||
self.module: ir.Module = ir.Module("main")
|
||||
self.builder: ir.IRBuilder = ir.IRBuilder()
|
||||
self.environment: Environment = Environment()
|
||||
self.errors: list[str] = []
|
||||
|
||||
def compile(self, node: Node) -> None:
|
||||
match node.type():
|
||||
@@ -40,6 +41,8 @@ class Compiler:
|
||||
self.__visit_block_statement(node)
|
||||
case NodeType.ReturnStatement:
|
||||
self.__visit_return_statement(node)
|
||||
case NodeType.ReassignStatement:
|
||||
self.__visit_reassign_statement(node)
|
||||
|
||||
# Expressions
|
||||
case NodeType.InfixExpression:
|
||||
@@ -115,6 +118,17 @@ class Compiler:
|
||||
|
||||
self.builder = previous_builder
|
||||
|
||||
def __visit_reassign_statement(self, node: ReassignStatement) -> None:
|
||||
name: str = node.ident.value
|
||||
value: Expression = node.right_value
|
||||
|
||||
value, Type = self.__resolve_value(value)
|
||||
|
||||
if self.environment.lookup(name) is None:
|
||||
self.errors.append(f"Identifier {name} has not been declared before it was re-assigned.")
|
||||
else:
|
||||
ptr, _ = self.environment.lookup(name)
|
||||
self.builder.store(value, ptr)
|
||||
# endregion
|
||||
|
||||
# region Expressions
|
||||
|
||||
Reference in New Issue
Block a user