aboutsummaryrefslogtreecommitdiffhomepage
path: root/parse.c
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2025-07-29 08:51:00 +0900
committernsfisis <nsfisis@gmail.com>2025-08-15 10:04:36 +0900
commitf30a6e048ccadd33c889caaa8012cfabfd5c2da9 (patch)
treed64763931b2013024feb8505785840d47c51a03f /parse.c
parentbfd0e04870c7cc55e8c2a9ee5e7b3e39fc9286c2 (diff)
downloadducc-f30a6e048ccadd33c889caaa8012cfabfd5c2da9.tar.gz
ducc-f30a6e048ccadd33c889caaa8012cfabfd5c2da9.tar.zst
ducc-f30a6e048ccadd33c889caaa8012cfabfd5c2da9.zip
feat: implement bitwise or
Diffstat (limited to 'parse.c')
-rw-r--r--parse.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/parse.c b/parse.c
index 469ed49..057d5c2 100644
--- a/parse.c
+++ b/parse.c
@@ -474,13 +474,29 @@ AstNode* parse_equality_expr(Parser* p) {
return lhs;
}
-AstNode* parse_logical_and_expr(Parser* p) {
+AstNode* parse_bitwise_or_expr(Parser* p) {
AstNode* lhs = parse_equality_expr(p);
while (1) {
TokenKind op = peek_token(p)->kind;
- if (op == TokenKind_andand) {
+ if (op == TokenKind_or) {
next_token(p);
AstNode* rhs = parse_equality_expr(p);
+ lhs = ast_new_binary_expr(op, lhs, rhs);
+ lhs->ty = type_new(TypeKind_int);
+ } else {
+ break;
+ }
+ }
+ return lhs;
+}
+
+AstNode* parse_logical_and_expr(Parser* p) {
+ AstNode* lhs = parse_bitwise_or_expr(p);
+ while (1) {
+ TokenKind op = peek_token(p)->kind;
+ if (op == TokenKind_andand) {
+ next_token(p);
+ AstNode* rhs = parse_bitwise_or_expr(p);
AstNode* e = ast_new(AstNodeKind_logical_expr);
e->node_op = op;
e->node_lhs = lhs;