diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2021-05-03 12:02:12 -0700 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2021-05-03 12:02:12 -0700 |
commit | 93f1bee02c694c775fd5814990ae68bfcb9dcf3d (patch) | |
tree | 29c3b9077d0abe9bd7dd8b9a2aef5fecaf96ff42 /shell/parse.mu | |
parent | 71a04056a88104512d010e0947a85006812f5067 (diff) | |
download | mu-93f1bee02c694c775fd5814990ae68bfcb9dcf3d.tar.gz |
reading and printing backquotes and unquotes
Diffstat (limited to 'shell/parse.mu')
-rw-r--r-- | shell/parse.mu | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/shell/parse.mu b/shell/parse.mu index 03e0488e..283e1d49 100644 --- a/shell/parse.mu +++ b/shell/parse.mu @@ -57,6 +57,54 @@ fn parse-sexpression tokens: (addr stream cell), _out: (addr handle cell), trace close-paren?, dot? <- parse-sexpression tokens, right-ah, trace return close-paren?, dot? } + # backquote quote -> parse as list with a special car + var backquote-token?/eax: boolean <- backquote-token? curr-token + compare backquote-token?, 0/false + { + break-if-= + var out/edi: (addr handle cell) <- copy _out + allocate-pair out + var out-addr/eax: (addr cell) <- lookup *out + var left-ah/edx: (addr handle cell) <- get out-addr, left + new-symbol left-ah, "`" + var right-ah/edx: (addr handle cell) <- get out-addr, right + var close-paren?/eax: boolean <- copy 0/false + var dot?/ecx: boolean <- copy 0/false + close-paren?, dot? <- parse-sexpression tokens, right-ah, trace + return close-paren?, dot? + } + # unquote -> parse as list with a special car + var unquote-token?/eax: boolean <- unquote-token? curr-token + compare unquote-token?, 0/false + { + break-if-= + var out/edi: (addr handle cell) <- copy _out + allocate-pair out + var out-addr/eax: (addr cell) <- lookup *out + var left-ah/edx: (addr handle cell) <- get out-addr, left + new-symbol left-ah, "," + var right-ah/edx: (addr handle cell) <- get out-addr, right + var close-paren?/eax: boolean <- copy 0/false + var dot?/ecx: boolean <- copy 0/false + close-paren?, dot? <- parse-sexpression tokens, right-ah, trace + return close-paren?, dot? + } + # unquote-splice -> parse as list with a special car + var unquote-splice-token?/eax: boolean <- unquote-splice-token? curr-token + compare unquote-splice-token?, 0/false + { + break-if-= + var out/edi: (addr handle cell) <- copy _out + allocate-pair out + var out-addr/eax: (addr cell) <- lookup *out + var left-ah/edx: (addr handle cell) <- get out-addr, left + new-symbol left-ah, ",@" + var right-ah/edx: (addr handle cell) <- get out-addr, right + var close-paren?/eax: boolean <- copy 0/false + var dot?/ecx: boolean <- copy 0/false + close-paren?, dot? <- parse-sexpression tokens, right-ah, trace + return close-paren?, dot? + } # dot -> return var dot?/eax: boolean <- dot-token? curr-token compare dot?, 0/false |