about summary refs log tree commit diff
path: root/src/bootstrap/parser.pry
diff options
context:
space:
mode:
authorBaitinq <[email protected]>2025-07-13 11:26:30 +0200
committerBaitinq <[email protected]>2025-07-13 11:26:30 +0200
commit792f56587f1594c96c12c7a3446c9c245295a0a7 (patch)
treead527e244b5658f32449b51f5940f00cb239f8ad /src/bootstrap/parser.pry
parentBoostrap: Support assigning to ptrs (diff)
downloadpry-lang-792f56587f1594c96c12c7a3446c9c245295a0a7.tar.gz
pry-lang-792f56587f1594c96c12c7a3446c9c245295a0a7.tar.bz2
pry-lang-792f56587f1594c96c12c7a3446c9c245295a0a7.zip
Boostrap: Support sizeof builtin
Diffstat (limited to '')
-rw-r--r--src/bootstrap/parser.pry46
1 files changed, 46 insertions, 0 deletions
diff --git a/src/bootstrap/parser.pry b/src/bootstrap/parser.pry
index 5c34edb..355b54d 100644
--- a/src/bootstrap/parser.pry
+++ b/src/bootstrap/parser.pry
@@ -345,6 +345,40 @@ let parser_parse_cast_statement = (p: *parser) => *Node {
 	return create_node(p, r);
 };
 
+/* SizeOfStatement ::= "sizeof" LPAREN TYPE RPAREN */
+let parser_parse_sizeof_statement = (p: *parser) => *Node {
+	let ident = parser_accept_token(p, TOKEN_IDENTIFIER);
+	if ident == cast(*token, null) {
+		return cast(*Node, null);
+	};
+
+	if !strcmp(cast(*i8, (*ident).data), "sizeof") {
+		return cast(*Node, null);
+	};
+
+	if parser_accept_token(p, TOKEN_LPAREN) == cast(*token, null) {
+		return cast(*Node, null);
+	};
+	
+	let typ = parser_parse_type(p);
+	if typ == cast(*Node, null) {
+		return cast(*Node, null);
+	};
+	
+	if parser_accept_token(p, TOKEN_RPAREN) == cast(*token, null) {
+		return cast(*Node, null);
+	};
+
+	let d = cast(*NODE_SIZEOF_STATEMENT_DATA , arena_alloc((*p).arena, sizeof(NODE_SIZEOF_STATEMENT_DATA )));
+	(*d).typ = typ;
+
+	let r = Node{};
+	r.type = NODE_SIZEOF_STATEMENT;
+	r.data = cast(*void, d);
+
+	return create_node(p, r);
+};
+
 /* FunctionType ::= LPAREN (Type ("," Type)*)? RPAREN ARROW Type */
 let parser_parse_function_type = (p: *parser) => *Node {
 	if parser_accept_token(p, TOKEN_LPAREN) == cast(*token, null) {
@@ -824,6 +858,10 @@ let parser_parse_postfix_expression = (p: *parser) => *Node {
 	if ex != cast(*Node, null) {
 		return ex;
 	};
+	let ex = parser_accept_parse(p, parser_parse_sizeof_statement);
+	if ex != cast(*Node, null) {
+		return ex;
+	};
 	let ex = parser_accept_parse(p, parse_function_call_statement);
 	if ex != cast(*Node, null) {
 		return ex;
@@ -1136,6 +1174,14 @@ let parser_parse_statement = (p: *parser) => *Node {
 		};
 	    return fn_call;
 	};
+	
+	let fn_call = parser_accept_parse(p, parser_parse_sizeof_statement);
+	if fn_call != cast(*Node, null) {
+		if parser_accept_token(p, TOKEN_SEMICOLON) == cast(*token, null) {
+		    return cast(*Node, null);
+		};
+	    return fn_call;
+	};
 
 	let fn_call = parser_accept_parse(p, parse_function_call_statement);
 	if fn_call != cast(*Node, null) {