about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBaitinq <[email protected]>2025-06-05 00:08:00 +0200
committerBaitinq <[email protected]>2025-06-05 00:08:00 +0200
commit7371673ab581f2ab4db313dadf21c661ce0b7d87 (patch)
treecaf5fa7a73be8acc8ed4df0a4e45920b976ed72c
parentstd: Add assert impl (diff)
downloadinterpreter-7371673ab581f2ab4db313dadf21c661ce0b7d87.tar.gz
interpreter-7371673ab581f2ab4db313dadf21c661ce0b7d87.tar.bz2
interpreter-7371673ab581f2ab4db313dadf21c661ce0b7d87.zip
Bootstrap: Codegen: Continue implementation
-rw-r--r--src/bootstrap/codegen.src35
-rw-r--r--src/bootstrap/main.src4
-rw-r--r--src/bootstrap/parser.src13
-rw-r--r--src/codegen.zig2
4 files changed, 43 insertions, 11 deletions
diff --git a/src/bootstrap/codegen.src b/src/bootstrap/codegen.src
index 3a76c16..5a08369 100644
--- a/src/bootstrap/codegen.src
+++ b/src/bootstrap/codegen.src
@@ -28,7 +28,40 @@ let codegen_init = (alloc: *arena) => *codegen {
 	return c;
 };
 
-let codegen_generate = (c: *codegen) => i64 {
+let codegen_generate_assignment_statement = (c: *codegen, stmt: *NODE_ASSIGNMENT_STATEMENT_DATA) => i64 {
+	println("HOLA");
+	return 0;
+};
+
+let codegen_generate_statement = (c: *codegen, statement: *Node) => i64 {
+	let stmt = *statement;
+	assert(stmt.type == NODE_ASSIGNMENT_STATEMENT); /* TODO: generate other node types */
+
+	let res = codegen_generate_assignment_statement(c, cast(*NODE_ASSIGNMENT_STATEMENT_DATA, stmt.data));
+	if res != 0 {
+		return 1;
+	};
+	println("STMT: %d", stmt.type);
+	return 0;
+};
+
+let codegen_generate = (c: *codegen, ast: *Node) => i64 {
+	assert((*ast).type == NODE_PROGRAM);
+
+	let program = *cast(*NODE_PROGRAM_DATA, (*ast).data);
+
+	let i = 0;
+	while i < program.statements_len {
+		let stmt = *(program.statements + cast(**Node, i));
+
+		let res = codegen_generate_statement(c, stmt);
+		if res != 0 {
+			return 1;
+		};
+
+		i = i + 1;
+	};
+
 	return 0;
 };
 
diff --git a/src/bootstrap/main.src b/src/bootstrap/main.src
index 23defd1..6cb2949 100644
--- a/src/bootstrap/main.src
+++ b/src/bootstrap/main.src
@@ -56,10 +56,10 @@ let main = (argc: i64, argv: **i8) => i64 {
 	let ts = tokenizer_tokenize(t);
 
 	let p = parser_init(cast(*token, ts.data), ts.data_len, alloc);
-	let ns = parse(p);
+	let ast = parse(p);
 
 	let c = codegen_init(alloc);
-	let res = codegen_generate(c);
+	let res = codegen_generate(c, ast);
 	let res = codegen_compile(c);
 	codegen_deinit(c);
 
diff --git a/src/bootstrap/parser.src b/src/bootstrap/parser.src
index 6b9bbaf..9ee53f6 100644
--- a/src/bootstrap/parser.src
+++ b/src/bootstrap/parser.src
@@ -50,7 +50,7 @@ let UNARY_EXPRESSION_TYPE_MINUS = 1;
 let UNARY_EXPRESSION_TYPE_STAR = 2;
 
 let NODE_PROGRAM_DATA = struct {
-    statements: *Node,
+    statements: **Node,
     statements_len: i64,
 };
 
@@ -78,13 +78,13 @@ let NODE_FUNCTION_CALL_STATEMENT_DATA = struct {
 
 let NODE_IF_STATEMENT_DATA = struct {
     condition: *Node,
-    statements: *Node,
+    statements: **Node,
     statements_len: i64,
 };
 
 let NODE_WHILE_STATEMENT_DATA = struct {
     condition: *Node,
-    statements: *Node,
+    statements: **Node,
     statements_len: i64,
 };
 
@@ -138,7 +138,7 @@ let NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA = struct {
 };
 
 let NODE_FUNCTION_DEFINITION_DATA = struct {
-    statements: *Node,
+    statements: **Node,
     statements_len: i64,
     parameters: *Node,
     parameters_len: i64,
@@ -325,7 +325,7 @@ let parse_statement = (p: *parser) => *Node {
 
 /* Program ::= Statement+ */
 let parse_program = (p: *parser) => *Node {
-	let nodes = cast(*Node, arena_alloc((*p).arena, sizeof(Node) * 1000));
+	let nodes = cast(**Node, arena_alloc((*p).arena, sizeof(*Node) * 1000));
 
 	let i = 0;
 	while (*p).offset < (*p).tokens_len {
@@ -334,8 +334,7 @@ let parse_program = (p: *parser) => *Node {
 			println("ERROR! Null node %d", (*p).offset);
 			return s;
 		};
-		println("PARSE 1 stmt");
-		(*(nodes + cast(*Node, i))) = s;
+		(*(nodes + cast(**Node, i))) = s;
 		i = i + 1;
 	};
 
diff --git a/src/codegen.zig b/src/codegen.zig
index 3fb5573..118e274 100644
--- a/src/codegen.zig
+++ b/src/codegen.zig
@@ -853,7 +853,7 @@ pub const CodeGen = struct {
         if (ptr.node_type.TYPE == .STRUCT_TYPE) {
             typ = ptr.node_type;
         } else if (ptr.node_type.TYPE == .POINTER_TYPE) {
-            typ = self.environment.get_variable(ptr.node_type.TYPE.POINTER_TYPE.type.TYPE.SIMPLE_TYPE.name).?.node_type;
+            typ = self.environment.get_variable(ptr.node_type.TYPE.POINTER_TYPE.type.TYPE.SIMPLE_TYPE.name).?.node_type; //TODO: we shouldnt be able to get fields of pointers, we have to dref first.
         } else if (ptr.node_type.TYPE == .SIMPLE_TYPE) {
             typ = self.environment.get_variable(ptr.node_type.TYPE.SIMPLE_TYPE.name).?.node_type;
         } else {