From cefe477fdf8c8a7a081e08add9cafbe1d8a2acf0 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Wed, 13 Aug 2025 23:37:08 +0900 Subject: feat: implement shift operators --- parse.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) (limited to 'parse.c') diff --git a/parse.c b/parse.c index a0b2ff3..fb5c751 100644 --- a/parse.c +++ b/parse.c @@ -597,21 +597,36 @@ AstNode* parse_additive_expr(Parser* p) { return lhs; } -AstNode* parse_relational_expr(Parser* p) { +AstNode* parse_shift_expr(Parser* p) { AstNode* lhs = parse_additive_expr(p); while (1) { TokenKind op = peek_token(p)->kind; - if (op == TokenKind_lt || op == TokenKind_le) { + if (op == TokenKind_lshift || op == TokenKind_rshift) { next_token(p); AstNode* rhs = parse_additive_expr(p); lhs = ast_new_binary_expr(op, lhs, rhs); + } else { + break; + } + } + return lhs; +} + +AstNode* parse_relational_expr(Parser* p) { + AstNode* lhs = parse_shift_expr(p); + while (1) { + TokenKind op = peek_token(p)->kind; + if (op == TokenKind_lt || op == TokenKind_le) { + next_token(p); + AstNode* rhs = parse_shift_expr(p); + lhs = ast_new_binary_expr(op, lhs, rhs); } else if (op == TokenKind_gt) { next_token(p); - AstNode* rhs = parse_additive_expr(p); + AstNode* rhs = parse_shift_expr(p); lhs = ast_new_binary_expr(TokenKind_lt, rhs, lhs); } else if (op == TokenKind_ge) { next_token(p); - AstNode* rhs = parse_additive_expr(p); + AstNode* rhs = parse_shift_expr(p); lhs = ast_new_binary_expr(TokenKind_le, rhs, lhs); } else { break; -- cgit v1.2.3-70-g09d2