about summary refs log tree commit diff
path: root/src/bootstrap/parser.pry
diff options
context:
space:
mode:
authorBaitinq <[email protected]>2025-07-09 22:15:36 +0200
committerBaitinq <[email protected]>2025-07-09 22:15:36 +0200
commite17c3c2e297168aa3268b70cbd3a3d692bdde951 (patch)
tree6641768f70486c5387d7cf1614e6aaf6d9a9f4b8 /src/bootstrap/parser.pry
parentBootstrap: Support if statement (diff)
downloadpry-lang-e17c3c2e297168aa3268b70cbd3a3d692bdde951.tar.gz
pry-lang-e17c3c2e297168aa3268b70cbd3a3d692bdde951.tar.bz2
pry-lang-e17c3c2e297168aa3268b70cbd3a3d692bdde951.zip
Bootstrap: Support equality expressions
Diffstat (limited to 'src/bootstrap/parser.pry')
-rw-r--r--src/bootstrap/parser.pry114
1 files changed, 108 insertions, 6 deletions
diff --git a/src/bootstrap/parser.pry b/src/bootstrap/parser.pry
index 95f847b..cb8c269 100644
--- a/src/bootstrap/parser.pry
+++ b/src/bootstrap/parser.pry
@@ -200,6 +200,7 @@ let parser = struct {
 extern parser_parse_statement = (*parser) => *Node;
 extern parser_parse_expression = (*parser) => *Node;
 extern parse_function_call_statement = (*parser) => *Node;
+extern parser_parse_additive_expression = (*parser) => *Node;
 
 let parser_init = (ts: *token, ts_len: i64, ar: *arena) => *parser {
 	let p = cast(*parser, arena_alloc(ar, sizeof(parser)));
@@ -599,8 +600,105 @@ let parser_parse_primary_expression = (p: *parser) => *Node {
 
 /* EqualityExpression ::= AdditiveExpression ("==" | "!=" | "<=" | ">=" | "<" | ">") AdditiveExpression */
 let parser_parse_equality_expression = (p: *parser) => *Node {
-	/* TODO */
-	return cast(*Node, null);
+	let lhs = parser_parse_additive_expression(p);
+	if lhs == cast(*Node, null) {
+	    return cast(*Node, null);
+	};	
+
+	let typ = -1;
+	let ex = parser_accept_parse(p, (ip: *parser) => *Node {
+		if parser_accept_token(ip, TOKEN_BANG) == cast(*token, null) {
+			return cast(*Node, null);
+		};
+		if parser_accept_token(ip, TOKEN_BANG) == cast(*token, null) {
+			return cast(*Node, null);
+		};
+		let n = Node{};
+		return create_node(ip, n);
+	});
+	if ex != cast(*Node, null) {
+		typ = EQUALITY_EXPRESSION_TYPE_EQ;
+	};
+
+	if (typ == -1) {
+		ex = parser_accept_parse(p, (ip: *parser) => *Node {
+			if (parser_accept_token(ip, TOKEN_BANG) == cast(*token, null)) {
+				return cast(*Node, null);
+			};
+			if (parser_accept_token(ip, TOKEN_EQUALS) == cast(*token, null)) {
+				return cast(*Node, null);
+			};
+			let n = Node{};
+			return create_node(ip, n);
+		});
+		if (ex != cast(*Node, null)) {
+			typ = EQUALITY_EXPRESSION_TYPE_NE;
+		};
+	};
+
+	if (typ == -1) {
+		ex = parser_accept_parse(p, (ip: *parser) => *Node {
+			if (parser_accept_token(ip, TOKEN_LESS) == cast(*token, null)) {
+				return cast(*Node, null);
+			};
+			if (parser_accept_token(ip, TOKEN_EQUALS) == cast(*token, null)) {
+				return cast(*Node, null);
+			};
+			let n = Node{};
+			return create_node(ip, n);
+		});
+		if (ex != cast(*Node, null)) {
+			typ = EQUALITY_EXPRESSION_TYPE_LE;
+		};
+	};
+
+	if (typ == -1) {
+		ex = parser_accept_parse(p, (ip: *parser) => *Node {
+			if (parser_accept_token(ip, TOKEN_GREATER) == cast(*token, null)) {
+				return cast(*Node, null);
+			};
+			if (parser_accept_token(ip, TOKEN_EQUALS) == cast(*token, null)) {
+				return cast(*Node, null);
+			};
+			let n = Node{};
+			return create_node(ip, n);
+		});
+		if (ex != cast(*Node, null)) {
+			typ = EQUALITY_EXPRESSION_TYPE_GE;
+		};
+	};
+
+	if (typ == -1) {
+		if (parser_accept_token(p, TOKEN_LESS) != cast(*token, null)) {
+			typ = EQUALITY_EXPRESSION_TYPE_LT;
+		};
+	};
+
+	if (typ == -1) {
+		if (parser_accept_token(p, TOKEN_GREATER) != cast(*token, null)) {
+			typ = EQUALITY_EXPRESSION_TYPE_GT;
+		};
+	};
+
+	if typ == -1 {
+		return cast(*Node, null);
+	};
+	
+	let rhs = parser_parse_additive_expression(p);
+	if rhs == cast(*Node, null) {
+	    return cast(*Node, null);
+	};	
+	
+	let d = cast(*NODE_EQUALITY_EXPRESSION_DATA, arena_alloc((*p).arena, sizeof(NODE_EQUALITY_EXPRESSION_DATA)));
+	(*d).lhs = lhs;
+	(*d).rhs = rhs;
+	(*d).typ = typ;
+
+	let n = Node{};
+	n.type = NODE_EQUALITY_EXPRESSION ;
+	n.data = cast(*void, d);
+
+	return create_node(p, n); 
 };
 
 /* PostfixExpression ::= PrimaryExpression (CastStatement | SizeOfStatement | FunctionCallStatement | FieldAccess )* */
@@ -618,11 +716,15 @@ let parser_parse_unary_expression = (p: *parser) => *Node {
 	if parser_accept_token(p, TOKEN_BANG) != cast(*token, null) {
 	    typ = UNARY_EXPRESSION_TYPE_NOT;
 	};
-	if parser_accept_token(p, TOKEN_MINUS) != cast(*token, null) {
-	    typ = UNARY_EXPRESSION_TYPE_MINUS;
+	if typ == -1 {
+		if parser_accept_token(p, TOKEN_MINUS) != cast(*token, null) {
+		    typ = UNARY_EXPRESSION_TYPE_MINUS;
+		};
 	};
-	if parser_accept_token(p, TOKEN_MUL) != cast(*token, null) {
-	    typ = UNARY_EXPRESSION_TYPE_STAR;
+	if typ == -1 {
+		if parser_accept_token(p, TOKEN_MUL) != cast(*token, null) {
+		    typ = UNARY_EXPRESSION_TYPE_STAR;
+		};
 	};
 	if typ == -1 {
 		return parser_parse_postfix_expression(p);