]> git.mdlowis.com Git - proto/obnc.git/commitdiff
added constant operations for binary operators
authorMichael D. Lowis <mike@mdlowis.com>
Mon, 12 Jul 2021 11:56:16 +0000 (07:56 -0400)
committerMichael D. Lowis <mike@mdlowis.com>
Mon, 12 Jul 2021 11:56:16 +0000 (07:56 -0400)
cerise/src/ast.c
cerise/src/grammar.c

index 52ea2eaef2ffce158e05e4f49932de9467661b28..3664af863c390b5ec702732628c62919dd1301fb 100644 (file)
@@ -107,7 +107,115 @@ AstNode* ast_binop(int op, AstNode* left, AstNode* right)
 {
     assert(left);
     assert(right);
-    return ast_new(op, left->hdr.type, left, right, NULL);
+    AstNode* ret = NULL;
+    if (both_const(left,right))
+    {
+        AstValue* a = (AstValue*)left;
+        AstValue* b = (AstValue*)right;
+        if (a->hdr.type->form == FORM_INT || a->hdr.type->form == FORM_BOOL)
+        {
+            switch (op)
+            {
+                case '+': a->val.i = a->val.i +  b->val.i; break;
+                case '-': a->val.i = a->val.i -  b->val.i; break;
+                case '*': a->val.i = a->val.i *  b->val.i; break;
+                case '/': a->val.i = a->val.i /  b->val.i; break;
+                case '%': a->val.i = a->val.i %  b->val.i; break;
+                case AND: a->val.i = a->val.i && b->val.i; break;
+                case OR:  a->val.i = a->val.i || b->val.i; break;
+
+                case EQ:
+                    a->val.i = a->val.i == b->val.i;
+                    a->hdr.type = &BoolType;
+                    break;
+
+                case NEQ:
+                    a->val.i = a->val.i != b->val.i;
+                    a->hdr.type = &BoolType;
+                    break;
+
+                case '<':
+                    a->val.i = a->val.i < b->val.i;
+                    a->hdr.type = &BoolType;
+                    break;
+
+                case LTEQ:
+                    a->val.i = a->val.i <= b->val.i;
+                    a->hdr.type = &BoolType;
+                    break;
+
+                case '>':
+                    a->val.i = a->val.i > b->val.i;
+                    a->hdr.type = &BoolType;
+                    break;
+
+                case GTEQ:
+                    a->val.i = a->val.i >= b->val.i;
+                    a->hdr.type = &BoolType;
+                    break;
+
+    //            case IS:    break;
+
+                default:
+                    assert(!"not a valid op");
+                    break;
+            }
+        }
+        else if (a->hdr.type->form == FORM_REAL)
+        {
+            switch (op)
+            {
+                case '+': a->val.f = a->val.f +  b->val.f; break;
+                case '-': a->val.f = a->val.f -  b->val.f; break;
+                case '*': a->val.f = a->val.f *  b->val.f; break;
+                case '/': a->val.f = a->val.f /  b->val.f; break;
+
+                case EQ:
+                    a->val.f = a->val.f == b->val.f;
+                    a->hdr.type = &BoolType;
+                    break;
+
+                case NEQ:
+                    a->val.f = a->val.f != b->val.f;
+                    a->hdr.type = &BoolType;
+                    break;
+
+                case '<':
+                    a->val.f = a->val.f < b->val.f;
+                    a->hdr.type = &BoolType;
+                    break;
+
+                case LTEQ:
+                    a->val.f = a->val.f <= b->val.f;
+                    a->hdr.type = &BoolType;
+                    break;
+
+                case '>':
+                    a->val.f = a->val.f > b->val.f;
+                    a->hdr.type = &BoolType;
+                    break;
+
+                case GTEQ:
+                    a->val.f = a->val.f >= b->val.f;
+                    a->hdr.type = &BoolType;
+                    break;
+
+                default:
+                    assert(!"not a valid op");
+                    break;
+            }
+        }
+        else
+        {
+            assert(!"not a valid form");
+        }
+        ret = (AstNode*)a;
+    }
+    else
+    {
+        ret = ast_new(op, left->hdr.type, left, right, NULL);
+    }
+    return ret;
 }
 
 AstNode* ast_unop(int op, AstNode* operand)
index 790dfbf0b491e4a3c53ce5f90c8921f43e1b3986..a0eaaba37a8c8b96462327862ac5c2a7c0876e5c 100644 (file)
@@ -270,6 +270,7 @@ static AstNode* simple_expr(Parser* p)
     {
         int op = consume(p); // OP
         AstNode* operand = term(p);
+//        check_num(p, operand);
         expr = ast_unop(op, operand);
     }
     else