diff options
| author | Baitinq <[email protected]> | 2025-06-05 00:08:00 +0200 |
|---|---|---|
| committer | Baitinq <[email protected]> | 2025-06-05 00:08:00 +0200 |
| commit | 7371673ab581f2ab4db313dadf21c661ce0b7d87 (patch) | |
| tree | caf5fa7a73be8acc8ed4df0a4e45920b976ed72c | |
| parent | std: Add assert impl (diff) | |
| download | interpreter-7371673ab581f2ab4db313dadf21c661ce0b7d87.tar.gz interpreter-7371673ab581f2ab4db313dadf21c661ce0b7d87.tar.bz2 interpreter-7371673ab581f2ab4db313dadf21c661ce0b7d87.zip | |
Bootstrap: Codegen: Continue implementation
| -rw-r--r-- | src/bootstrap/codegen.src | 35 | ||||
| -rw-r--r-- | src/bootstrap/main.src | 4 | ||||
| -rw-r--r-- | src/bootstrap/parser.src | 13 | ||||
| -rw-r--r-- | src/codegen.zig | 2 |
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 { |