about summary refs log tree commit diff stats
path: root/apps/arith.mu
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2020-06-15 23:04:58 -0700
committerKartik Agaram <vc@akkartik.com>2020-06-15 23:04:58 -0700
commitcdc9a7f57f860e2196ec00bdc22458bb0c61c64b (patch)
tree600e7f39c05858689823d47016e222458d57aed2 /apps/arith.mu
parent03a719d04bd1b28eb36462ade30a0b135c1a0e5c (diff)
downloadmu-cdc9a7f57f860e2196ec00bdc22458bb0c61c64b.tar.gz
6538 - arith: multi-ary arithmetic
Diffstat (limited to 'apps/arith.mu')
-rw-r--r--apps/arith.mu56
1 files changed, 31 insertions, 25 deletions
diff --git a/apps/arith.mu b/apps/arith.mu
index 54ceffd0..18e572e4 100644
--- a/apps/arith.mu
+++ b/apps/arith.mu
@@ -20,38 +20,44 @@ fn main -> exit-status/ebx: int {
 }
 
 fn simplify -> result/eax: int, look/esi: byte {
+  # prime the pump
   look <- get-char  # prime the pump
-  # first arg
   look <- skip-spaces look
   result, look <- num look
-  # operator
-  var op/ecx: byte <- copy 0
-  look <- skip-spaces look
-  op, look <- operator look
-  # second arg
-  var second/edx: int <- copy 0
-  look <- skip-spaces look
-  {
-    var tmp/eax: int <- copy 0
-    tmp, look <- num look
-    second <- copy tmp
-  }
-  # perform op
-  $simplify:perform-op: {
+  $simplify:loop: {
+    # operator
+    var op/ecx: byte <- copy 0
+    look <- skip-spaces look
+    compare look, 0
+    break-if-=
+    compare look, 0xa
+    break-if-=
+    op, look <- operator look
+    # second arg
+    var second/edx: int <- copy 0
+    look <- skip-spaces look
     {
-      compare op, 0x2b  # '+'
-      break-if-!=
-      result <- add second
-      break $simplify:perform-op
+      var tmp/eax: int <- copy 0
+      tmp, look <- num look
+      second <- copy tmp
     }
-    {
-      compare op, 0x2d  # '-'
-      break-if-!=
-      result <- subtract second
-      break $simplify:perform-op
+    # perform op
+    $simplify:perform-op: {
+      {
+        compare op, 0x2b  # '+'
+        break-if-!=
+        result <- add second
+        break $simplify:perform-op
+      }
+      {
+        compare op, 0x2d  # '-'
+        break-if-!=
+        result <- subtract second
+        break $simplify:perform-op
+      }
     }
+    loop
   }
-  # trailing spaces
   look <- skip-spaces look
 }