mescc: Tinycc support: initializer arithmetic.
authorJan Nieuwenhuizen <janneke@gnu.org>
Sun, 27 Aug 2017 10:57:50 +0000 (12:57 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Sun, 27 Aug 2017 10:57:50 +0000 (12:57 +0200)
* module/language/c99/compiler.mes (p-expr->bool): New function
  (p-expr->number): Support bitwise-and, bitwise-not, cast, cond-expr.

module/language/c99/compiler.mes

index 6e70c86af37f6fa9105b6f4fc184d6dc68053b2f..e0a1df3f7ab5e4527064746909b01659adc32d38 100644 (file)
      (- (p-expr->number info a)))
     ((add ,a ,b)
      (+ (p-expr->number info a) (p-expr->number info b)))
+    ((bitwise-and ,a ,b)
+     (logand (p-expr->number info a) (p-expr->number info b)))
+    ((bitwise-not ,a)
+     (lognot (p-expr->number info a)))
     ((bitwise-or ,a ,b)
      (logior (p-expr->number info a) (p-expr->number info b)))
     ((div ,a ,b)
      (let ((value (assoc-ref (.constants info) name)))
        (or value
            (error (format #f "p-expr->number: undeclared identifier: ~s\n" o)))))
+    ((cast ,type ,expr) (p-expr->number info expr))
+    ((cond-expr ,test ,then ,else)
+     (if (p-expr->bool info test) (p-expr->number info then) (p-expr->number info else)))
     (_  (error (format #f "p-expr->number: not supported: ~s\n" o)))))
 
+(define (p-expr->bool info o)
+  (pmatch o
+    ((eq ,a ,b) (eq? (p-expr->number info a) (p-expr->number info b)))))
+
 (define (struct-field info)
   (lambda (o)
     (pmatch o