about summary refs log tree commit diff
path: root/src/bootstrap/parser.pry
diff options
context:
space:
mode:
authorBaitinq <[email protected]>2025-07-13 17:50:08 +0200
committerBaitinq <[email protected]>2025-07-13 17:50:08 +0200
commit78458e09a22499193eeb9ee6e852789187b1d044 (patch)
treec79237fd1665a59f78656485bf5ede01ee395cd4 /src/bootstrap/parser.pry
parentBoostrap: Support struct definition (diff)
downloadpry-lang-78458e09a22499193eeb9ee6e852789187b1d044.tar.gz
pry-lang-78458e09a22499193eeb9ee6e852789187b1d044.tar.bz2
pry-lang-78458e09a22499193eeb9ee6e852789187b1d044.zip
Boostrap: Support struct instanciation
Diffstat (limited to 'src/bootstrap/parser.pry')
-rw-r--r--src/bootstrap/parser.pry27
1 files changed, 27 insertions, 0 deletions
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);