about summary refs log tree commit diff
path: root/src/bootstrap/parser.pry
diff options
context:
space:
mode:
authorBaitinq <[email protected]>2025-06-23 23:20:12 +0200
committerBaitinq <[email protected]>2025-06-23 23:20:12 +0200
commitf669cdf21a09c630a748ace4b067699b6eb6c661 (patch)
tree59c7a2c5fb6aa00b0ccd354c460307c642c9cd88 /src/bootstrap/parser.pry
parentstd: Add hashmap impl (diff)
downloadpry-lang-f669cdf21a09c630a748ace4b067699b6eb6c661.tar.gz
pry-lang-f669cdf21a09c630a748ace4b067699b6eb6c661.tar.bz2
pry-lang-f669cdf21a09c630a748ace4b067699b6eb6c661.zip
boostrap: implement enough for first example to work
Diffstat (limited to 'src/bootstrap/parser.pry')
-rw-r--r--src/bootstrap/parser.pry30
1 files changed, 22 insertions, 8 deletions
diff --git a/src/bootstrap/parser.pry b/src/bootstrap/parser.pry
index daac296..0b6d5b6 100644
--- a/src/bootstrap/parser.pry
+++ b/src/bootstrap/parser.pry
@@ -160,7 +160,7 @@ let NODE_TYPE_SIMPLE_TYPE_DATA = struct {
 };
 
 let NODE_TYPE_FUNCTION_TYPE_DATA = struct {
-    parameters: *Node,
+    parameters: **Node,
     parameters_len: i64,
     retur_type: *Node,
 };
@@ -294,8 +294,6 @@ let parser_parse_type = (p: *parser) => *Node {
 
 /* FunctionParameters ::= IDENTIFIER ":" Type ("," IDENTIFIER ":" Type)* */
 let parser_parse_function_parameters = (p: *parser) => *slice {
-	/* TODO: Params */
-
 	let node_list = cast(**Node, arena_alloc((*p).arena, sizeof(**Node) * 20));
 	let i = 0;
 	while true {
@@ -306,12 +304,28 @@ let parser_parse_function_parameters = (p: *parser) => *slice {
 		if ident == cast(*token, null) {
 			break;
 		};
-		/* TODO: Rest */
+		if parser_accept_token(p, TOKEN_COLON) == cast(*token, null) {
+			return cast(*slice, null);
+		};
+		let type_annotation = parser_parse_type(p);
+		if type_annotation == cast(*Node, null) {
+			return cast(*slice, null);
+		};
+
+		let d = cast(*NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, arena_alloc((*p).arena, sizeof(NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA)));
+		(*d).name = cast(*i8, ident.data);
+		(*d).type = type_annotation;
+		let n = Node{};
+		n.type = NODE_PRIMARY_EXPRESSION_IDENTIFIER;
+		n.data = cast(*void, d);
+		(*(node_list + cast(**Node, i))) = create_node(p, n);
+
+		i = i + 1;
 	};
 
 	let s = cast(*slice, arena_alloc((*p).arena, sizeof(slice)));
 	(*s).data = cast(*void, node_list);
-	(*s).data_len = 0;
+	(*s).data_len = i;
 	return s;
 };
 
@@ -359,9 +373,9 @@ let parser_parse_function_definition = (p: *parser) => *Node {
 	let d = cast(*NODE_FUNCTION_DEFINITION_DATA, arena_alloc((*p).arena, sizeof(NODE_FUNCTION_DEFINITION_DATA)));
 	(*d).statements = statements;
 	(*d).statements_len = i;
-	(*d).parameters = cast(**Node, params.data);
-	(*d).parameters_len = params.data_len;
-	(*d).retur_type = cast(*Node, null);
+	(*d).parameters = cast(**Node, (*params).data);
+	(*d).parameters_len = (*params).data_len;
+	(*d).retur_type = retur_type;
 
 	let n = Node{};
 	n.type = NODE_FUNCTION_DEFINITION;