about summary refs log tree commit diff
path: root/src/bootstrap/parser.pry
diff options
context:
space:
mode:
authorBaitinq <[email protected]>2025-07-13 10:06:44 +0200
committerBaitinq <[email protected]>2025-07-13 10:06:44 +0200
commitb74dc51d07ca6f928127223165ed84e5a5b33e78 (patch)
tree6b3554c30aac27ad31f8858af26c9a83bded1901 /src/bootstrap/parser.pry
parentBoostrap: Support calling function ptr (diff)
downloadpry-lang-b74dc51d07ca6f928127223165ed84e5a5b33e78.tar.gz
pry-lang-b74dc51d07ca6f928127223165ed84e5a5b33e78.tar.bz2
pry-lang-b74dc51d07ca6f928127223165ed84e5a5b33e78.zip
Boostrap: Fuction def call and multiplicative expr
Diffstat (limited to 'src/bootstrap/parser.pry')
-rw-r--r--src/bootstrap/parser.pry28
1 files changed, 18 insertions, 10 deletions
diff --git a/src/bootstrap/parser.pry b/src/bootstrap/parser.pry
index bc36a41..5c34edb 100644
--- a/src/bootstrap/parser.pry
+++ b/src/bootstrap/parser.pry
@@ -1084,12 +1084,14 @@ let parser_parse_function_arguments = (p: *parser) => *slice {
 /* FunctionCallStatement ::= (IDENTIFIER | FunctionDefinition) LPAREN FunctionArguments? RPAREN */
 let parse_function_call_statement = (p: *parser) => *Node {
 	let ident = parser_accept_token(p, TOKEN_IDENTIFIER);
+	let fn_def = parser_accept_parse(p, parser_parse_function_definition);
+
 	if ident == cast(*token, null) {
-		return cast(*Node, null);
+		if fn_def == cast(*Node, null) {
+			return cast(*Node, null);
+		};
 	};
 
-	/* TODO: Function definition call */
-		
 	if parser_accept_token(p, TOKEN_LPAREN) == cast(*token, null) {
 	    return cast(*Node, null);
 	};
@@ -1103,16 +1105,22 @@ let parse_function_call_statement = (p: *parser) => *Node {
 	    return cast(*Node, null);
 	};
 
-	let expression_data = cast(*NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, arena_alloc((*p).arena, sizeof(NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA)));
-	(*expression_data).name = cast(*i8, (*ident).data);
-	let expression = cast(*Node, arena_alloc((*p).arena, sizeof(Node)));
-	(*expression).type = NODE_PRIMARY_EXPRESSION_IDENTIFIER;
-	(*expression).data = cast(*void, expression_data);
-
 	let d = cast(*NODE_FUNCTION_CALL_STATEMENT_DATA , arena_alloc((*p).arena, sizeof(NODE_FUNCTION_CALL_STATEMENT_DATA)));
-	(*d).expression = expression;
 	(*d).arguments = cast(**Node, (*arguments).data);
 	(*d).arguments_len = (*arguments).data_len;
+
+	if fn_def != cast(*Node, null) {
+		(*d).expression = fn_def;
+	};
+	if fn_def == cast(*Node, null) {
+		let expression_data = cast(*NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, arena_alloc((*p).arena, sizeof(NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA)));
+		(*expression_data).name = cast(*i8, (*ident).data);
+		let expression = cast(*Node, arena_alloc((*p).arena, sizeof(Node)));
+		(*expression).type = NODE_PRIMARY_EXPRESSION_IDENTIFIER;
+		(*expression).data = cast(*void, expression_data);
+		(*d).expression = expression;
+	};
+
 	let n = Node{};
 	n.type = NODE_FUNCTION_CALL_STATEMENT;
 	n.data = cast(*void, d);