diff options
| -rw-r--r-- | asm.myr | 30 |
1 files changed, 21 insertions, 9 deletions
@@ -71,14 +71,23 @@ const emitinstr = {p -> `std.Ok((b, mark)) } +const die_emit = {msg, lc + std.die(std.fmt("{} on line {}\n", msg, lc)) +} + +const die_rewrite = {l, lc + const s = "ref to undefined label '{}' on line {}\n" + std.die(std.fmt(s, l, lc)) +} + const main = { var fd = bio.mkfile(std.In, bio.Rd) var src = bio.byline(fd) var lc = 0 var offset = 0 - var queue = [][:] var buf = [][:] + var q = [][:] var labels = std.mkht() var res @@ -90,14 +99,16 @@ const main = { ;; match res - | `std.Err(msg): std.die(std.fmt("{} on line {}\n", msg, lc)) + | `std.Err(msg): die_emit(msg, lc) | `std.Ok((bytes, marker)): match marker - | `std.Some(label): queue = std.slpush(&queue, (label, offset, lc)) + | `std.Some(label): + q = std.slpush(&q, (label, offset, lc)) | `std.None: ;; match bytes - | `std.Some(arr): buf = std.sljoin(&buf, arr[:]) + | `std.Some(arr): + buf = std.sljoin(&buf, arr[:]) offset += 2 | `std.None: ;; @@ -106,12 +117,13 @@ const main = { lc++ ;; - for replacement : queue ; - match replacement - | (l, buf_pos, src_pos): + for p : q ; + match p + | (l, buf_pos, linum): match std.htget(labels, l) - | `std.None: std.die(std.fmt("reference to undefined label '{}' on line {}\n", l, src_pos)) - | `std.Some(addr): buf[buf_pos] |= addr & 0x0f00 + | `std.None: die_rewrite(l, linum) + | `std.Some(addr): + buf[buf_pos] |= addr & 0x0f00 buf[buf_pos + 1] |= addr & 0xff ;; ;; |