diff options
| author | nsfisis <nsfisis@gmail.com> | 2025-08-13 23:37:08 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2025-08-15 10:06:21 +0900 |
| commit | cefe477fdf8c8a7a081e08add9cafbe1d8a2acf0 (patch) | |
| tree | eb0e53cfebe273636ebaf3d6b5e50936903302ad /parse.c | |
| parent | 7685bff588632a486a9e677c63ae7123b112ba9e (diff) | |
| download | ducc-cefe477fdf8c8a7a081e08add9cafbe1d8a2acf0.tar.gz ducc-cefe477fdf8c8a7a081e08add9cafbe1d8a2acf0.tar.zst ducc-cefe477fdf8c8a7a081e08add9cafbe1d8a2acf0.zip | |
feat: implement shift operators
Diffstat (limited to 'parse.c')
| -rw-r--r-- | parse.c | 23 |
1 files changed, 19 insertions, 4 deletions
@@ -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; |
