aboutsummaryrefslogtreecommitdiffhomepage
path: root/parse.c
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2025-08-13 23:37:08 +0900
committernsfisis <nsfisis@gmail.com>2025-08-15 10:06:21 +0900
commitcefe477fdf8c8a7a081e08add9cafbe1d8a2acf0 (patch)
treeeb0e53cfebe273636ebaf3d6b5e50936903302ad /parse.c
parent7685bff588632a486a9e677c63ae7123b112ba9e (diff)
downloadducc-cefe477fdf8c8a7a081e08add9cafbe1d8a2acf0.tar.gz
ducc-cefe477fdf8c8a7a081e08add9cafbe1d8a2acf0.tar.zst
ducc-cefe477fdf8c8a7a081e08add9cafbe1d8a2acf0.zip
feat: implement shift operators
Diffstat (limited to 'parse.c')
-rw-r--r--parse.c23
1 files changed, 19 insertions, 4 deletions
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;