diff options
| author | Baitinq <[email protected]> | 2025-07-13 17:50:08 +0200 |
|---|---|---|
| committer | Baitinq <[email protected]> | 2025-07-13 17:50:08 +0200 |
| commit | 78458e09a22499193eeb9ee6e852789187b1d044 (patch) | |
| tree | c79237fd1665a59f78656485bf5ede01ee395cd4 /src | |
| parent | Boostrap: Support struct definition (diff) | |
| download | pry-lang-78458e09a22499193eeb9ee6e852789187b1d044.tar.gz pry-lang-78458e09a22499193eeb9ee6e852789187b1d044.tar.bz2 pry-lang-78458e09a22499193eeb9ee6e852789187b1d044.zip | |
Boostrap: Support struct instanciation
Diffstat (limited to 'src')
| -rw-r--r-- | src/bootstrap/codegen.pry | 15 | ||||
| -rw-r--r-- | src/bootstrap/parser.pry | 27 |
2 files changed, 42 insertions, 0 deletions
diff --git a/src/bootstrap/codegen.pry b/src/bootstrap/codegen.pry index 9363265..858ebfa 100644 --- a/src/bootstrap/codegen.pry +++ b/src/bootstrap/codegen.pry @@ -170,6 +170,14 @@ let codegen_get_llvm_type = (c: *codegen, node: *Node) => *LLVMTypeRef { return r; }; + let v = environment_get_variable((*c).environment, simple_type.name); + if (v != cast(*Variable, null)) { + assert((*v).type != cast(LLVMTypeRef, null)); + let r = cast(*LLVMTypeRef, arena_alloc((*c).arena, sizeof(LLVMTypeRef))); + *r = (*v).type; + return r; + }; + printf("NO SIMPLE TYPE %s!\n", simple_type.name); assert(false); }; @@ -783,6 +791,13 @@ let codegen_generate_expression_value = (c: *codegen, expression: *Node, name: * v.node_type = simple_type_node; return codegen_create_variable(c, v); }; + + if ((*expression).type == NODE_STRUCT_INSTANCIATION) { + let struc_data = *cast(*NODE_STRUCT_INSTANCIATION_DATA, (*expression).data); + let v = environment_get_variable((*c).environment, struc_data.typ); + assert(v != cast(*Variable, null)); + return v; + }; printf("ASSERT 1: %d\n", (*expression).type); assert(false); diff --git a/src/bootstrap/parser.pry b/src/bootstrap/parser.pry index 8cefefd..658d1f9 100644 --- a/src/bootstrap/parser.pry +++ b/src/bootstrap/parser.pry @@ -732,6 +732,29 @@ let parser_parse_function_definition = (p: *parser) => *Node { return create_node(p, n); }; +let parser_parse_struct_instanciation = (p: *parser) => *Node { + let typ = parser_accept_token(p, TOKEN_IDENTIFIER); + if typ == cast(*token, null) { + return cast(*Node, null); + }; + + if parser_accept_token(p, TOKEN_LBRACE) == cast(*token, null) { + return cast(*Node, null); + }; + if parser_accept_token(p, TOKEN_RBRACE) == cast(*token, null) { + return cast(*Node, null); + }; + + let d = cast(*NODE_STRUCT_INSTANCIATION_DATA, arena_alloc((*p).arena, sizeof(NODE_STRUCT_INSTANCIATION_DATA))); + (*d).typ = cast(*i8, (*typ).data); + + let n = Node{}; + n.type = NODE_STRUCT_INSTANCIATION; + n.data = cast(*void, d); + + return create_node(p, n); +}; + /* PrimaryExpression ::= NULL | NUMBER | BOOLEAN | CHAR | STRING | IDENTIFIER | FunctionDefinition | StructDefinition | StructInstantiation | FieldAccess | LPAREN Expression RPAREN */ let parser_parse_primary_expression = (p: *parser) => *Node { let stmt = parser_accept_parse(p, parser_parse_function_definition); @@ -742,6 +765,10 @@ let parser_parse_primary_expression = (p: *parser) => *Node { if stmt != cast(*Node, null) { return stmt; }; + let stmt = parser_accept_parse(p, parser_parse_struct_instanciation); + if stmt != cast(*Node, null) { + return stmt; + }; if parser_accept_token(p, TOKEN_LPAREN) != cast(*token, null) { let expr = parser_parse_expression(p); |