ITS GENERATING AN EXECUTABLE LETS GOOOO
This commit is contained in:
26
generators/generator.py
Normal file
26
generators/generator.py
Normal file
@@ -0,0 +1,26 @@
|
||||
from ground_ast import RootNode
|
||||
|
||||
|
||||
class Generator:
|
||||
def __init__(self, ast: RootNode, code: str, output_path: str):
|
||||
self.ast = ast
|
||||
self.lines: list[str] = []
|
||||
self.code = code
|
||||
self.output_path = output_path
|
||||
|
||||
def init(self):
|
||||
pass
|
||||
|
||||
def generate_node(self, node):
|
||||
self.lines.append(f"; {node}\n\t")
|
||||
node_type = str(type(node))[19:-2]
|
||||
if not hasattr(self, f"generate_{node_type}"):
|
||||
raise Exception(f"Generator has no generate method for {node_type}.")
|
||||
getattr(self, f"generate_{node_type}")(node)
|
||||
|
||||
def generate(self):
|
||||
for statement in self.ast.statements:
|
||||
self.generate_node(statement)
|
||||
|
||||
with open(self.output_path + ".asm", "w") as f:
|
||||
f.writelines(self.lines)
|
22
generators/x86_64.py
Normal file
22
generators/x86_64.py
Normal file
@@ -0,0 +1,22 @@
|
||||
from generators.generator import Generator
|
||||
from ground_ast import *
|
||||
from error import traceback
|
||||
|
||||
class X86_64Generator(Generator):
|
||||
def init(self):
|
||||
self.lines.append("global _start\n\n")
|
||||
self.lines.append("_start:\n\t")
|
||||
self.generate()
|
||||
|
||||
def generate_InstructionNode(self, node: InstructionNode):
|
||||
if node.instruction == "end":
|
||||
if len(node.arguments) == 0:
|
||||
traceback(self.code, "TypeError", "end expects atleast 1 argument.")
|
||||
elif len(node.arguments) > 1:
|
||||
traceback(self.code, "TypeError", "end expects only 1 argument.")
|
||||
if not isinstance(node.arguments[0], NumberNode):
|
||||
traceback(self.code, "TypeError", f"end expects an integer, not {type(node.arguments[0])}")
|
||||
|
||||
self.lines.append("mov rax, 60\n\t")
|
||||
self.lines.append("mov rdi, " + str(node.arguments[0].value) + "\n\t")
|
||||
self.lines.append("syscall\n\n\t")
|
Reference in New Issue
Block a user