diff options
author | Kartik Agaram <vc@akkartik.com> | 2020-06-15 23:04:58 -0700 |
---|---|---|
committer | Kartik Agaram <vc@akkartik.com> | 2020-06-15 23:04:58 -0700 |
commit | cdc9a7f57f860e2196ec00bdc22458bb0c61c64b (patch) | |
tree | 600e7f39c05858689823d47016e222458d57aed2 | |
parent | 03a719d04bd1b28eb36462ade30a0b135c1a0e5c (diff) | |
download | mu-cdc9a7f57f860e2196ec00bdc22458bb0c61c64b.tar.gz |
6538 - arith: multi-ary arithmetic
-rw-r--r-- | apps/arith.mu | 56 |
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 } |