about summary refs log tree commit diff
path: root/src/bootstrap/parser.pry
diff options
context:
space:
mode:
authorBaitinq <[email protected]>2025-07-09 01:01:42 +0200
committerBaitinq <[email protected]>2025-07-09 01:01:42 +0200
commit7b2f901f166b95d42186e2532c25d8b140907c93 (patch)
tree5fc76a0b66347dc4deb3f63e2a9fc2f7166ec402 /src/bootstrap/parser.pry
parentBootstrap: Codegen: Support char types (diff)
downloadpry-lang-7b2f901f166b95d42186e2532c25d8b140907c93.tar.gz
pry-lang-7b2f901f166b95d42186e2532c25d8b140907c93.tar.bz2
pry-lang-7b2f901f166b95d42186e2532c25d8b140907c93.zip
Bootstrap: Support if statement
Diffstat (limited to 'src/bootstrap/parser.pry')
-rw-r--r--src/bootstrap/parser.pry50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/bootstrap/parser.pry b/src/bootstrap/parser.pry
index be1ffb7..95f847b 100644
--- a/src/bootstrap/parser.pry
+++ b/src/bootstrap/parser.pry
@@ -360,6 +360,48 @@ let parser_parse_type = (p: *parser) => *Node {
 	return cast(*Node, null);
 };
 
+/* IfStatement ::= "if" Expression LBRACE Statement* RBRACE */
+let parser_parse_if_statement = (p: *parser) => *Node {
+	if parser_accept_token(p, TOKEN_IF) == cast(*token, null) {
+		return cast(*Node, null);
+	};
+
+	let expression = parser_parse_expression(p);
+	if expression == cast(*Node, null) {
+	    return cast(*Node, null);
+	};
+	
+	if parser_accept_token(p, TOKEN_LBRACE) == cast(*token, null) {
+		return cast(*Node, null);
+	};
+
+	let statements = cast(**Node, arena_alloc((*p).arena, sizeof(*Node) * 100));
+	let i = 0;
+	while true {
+		let n = parser_accept_parse(p, parser_parse_statement);
+		if n == cast(*Node, null) {
+			break;
+		};
+		(*(statements + cast(**Node, i))) = n;
+		i = i + 1;
+	};
+	
+	if parser_accept_token(p, TOKEN_RBRACE) == cast(*token, null) {
+		return cast(*Node, null);
+	};
+	
+	let dd = cast(*NODE_IF_STATEMENT_DATA, arena_alloc((*p).arena, sizeof(NODE_IF_STATEMENT_DATA)));
+	(*dd).condition = expression;
+	(*dd).statements = statements;
+	(*dd).statements_len = i;
+
+	let r = Node{};
+	r.type = NODE_IF_STATEMENT;
+	r.data = cast(*void, dd);
+
+	return create_node(p, r);
+};
+
 /* ExternDeclaration ::= "extern" IDENTIFIER EQUALS Type */
 let parser_parse_extern_declaration = (p: *parser) => *Node {
 	if parser_accept_token(p, TOKEN_EXTERN) == cast(*token, null) {
@@ -807,6 +849,14 @@ let parser_parse_statement = (p: *parser) => *Node {
 		};
 	    return retu;
 	};
+	
+	let retu = parser_accept_parse(p, parser_parse_if_statement);
+	if retu != cast(*Node, null) {
+		if parser_accept_token(p, TOKEN_SEMICOLON) == cast(*token, null) {
+		    return cast(*Node, null);
+		};
+	    return retu;
+	};
 
 	printf("None\n");