diff options
author | Kartik Agaram <vc@akkartik.com> | 2020-02-10 00:47:10 -0800 |
---|---|---|
committer | Kartik Agaram <vc@akkartik.com> | 2020-02-16 01:14:06 -0800 |
commit | deacf2c94e7b6a549c5b302e18e5f7d1a68ec2a8 (patch) | |
tree | 1746f20a7469205b9c0203d205ceca9deaf14142 | |
parent | 65eb2a57148f02a5ce59b784c0aeaaca116c205b (diff) | |
download | mu-deacf2c94e7b6a549c5b302e18e5f7d1a68ec2a8.tar.gz |
6008
Allow comments at the end of all kinds of statements. To do this I replaced all calls to next-word with next-mu-token.. except one. I'm not seeing any bugs yet, any places where comments break things. But this exception makes me nervous.
-rw-r--r-- | apps/factorial.mu | 5 | ||||
-rwxr-xr-x | apps/mu | bin | 133613 -> 133605 bytes | |||
-rw-r--r-- | apps/mu.subx | 34 |
3 files changed, 20 insertions, 19 deletions
diff --git a/apps/factorial.mu b/apps/factorial.mu index a94be482..7d9015e2 100644 --- a/apps/factorial.mu +++ b/apps/factorial.mu @@ -1,13 +1,14 @@ fn main -> exit-status/ebx: int { #? run-tests #? result <- copy 0 + test-factorial # abc var tmp/eax: int <- factorial 5 exit-status <- copy tmp } fn factorial n: int -> result/eax: int { compare n 1 - { + { # foo break-if-> result <- copy 1 } @@ -15,7 +16,7 @@ fn factorial n: int -> result/eax: int { break-if-<= var tmp/ecx: int <- copy n tmp <- decrement - result <- factorial tmp + result <- factorial tmp # test comment result <- multiply n } } diff --git a/apps/mu b/apps/mu index e4a40dcc..a468f9d5 100755 --- a/apps/mu +++ b/apps/mu Binary files differdiff --git a/apps/mu.subx b/apps/mu.subx index c54cfdd6..778ef264 100644 --- a/apps/mu.subx +++ b/apps/mu.subx @@ -1686,14 +1686,14 @@ $parse-mu:error2: populate-mu-function-header: # first-line: (addr stream byte), out: (handle function), vars: (addr stack (handle var)) # pseudocode: # var name: slice - # next-word(first-line, name) + # next-mu-token(first-line, name) # assert(name not in '{' '}' '->') # out->name = slice-to-string(name) # var next-offset: int = 8 # ## inouts # while true # ## name - # name = next-word(first-line) + # name = next-mu-token(first-line) # if (name == '{') goto done # if (name == '->') break # assert(name != '}') @@ -1707,7 +1707,7 @@ populate-mu-function-header: # first-line: (addr stream byte), out: (handle fun # ## outputs # while true # ## name - # name = next-word(first-line) + # name = next-mu-token(first-line) # assert(name not in '{' '}' '->') # var v: (handle var) = parse-var-with-type(name, first-line) # assert(v->register != null) @@ -1732,7 +1732,7 @@ populate-mu-function-header: # first-line: (addr stream byte), out: (handle fun # var next-offset/edx = 8 ba/copy-to-edx 8/imm32 # read function name - (next-word *(ebp+8) %ecx) + (next-mu-token *(ebp+8) %ecx) # error checking # TODO: error if name starts with 'break' or 'loop' # if (word-slice == '{') abort @@ -1755,7 +1755,7 @@ populate-mu-function-header: # first-line: (addr stream byte), out: (handle fun # save function inouts { $populate-mu-function-header:check-for-inout: - (next-word *(ebp+8) %ecx) + (next-mu-token *(ebp+8) %ecx) # if (word-slice == '{') goto done (slice-equal? %ecx "{") # => eax 3d/compare-eax-and 0/imm32 @@ -1789,8 +1789,8 @@ $populate-mu-function-header:check-for-inout: } # save function outputs { -$parse-var-with-type:check-for-out: - (next-word *(ebp+8) %ecx) +$populate-mu-function-header:check-for-out: + (next-mu-token *(ebp+8) %ecx) # if (word-slice == '{') break (slice-equal? %ecx "{") # => eax 3d/compare-eax-and 0/imm32 @@ -2335,8 +2335,7 @@ next-mu-token: # in: (addr stream byte), out: (addr slice) # ++in->read # goto start # if curr-byte == '#' # comment - # in->read = in->write # skip to end of in - # goto done + # goto done # treat as eof # if curr-byte == '"' # string literal # skip-string(in) # goto done # no metadata @@ -2435,10 +2434,7 @@ $next-mu-token:check-for-comment: # if (curr-byte != '#') break 3d/compare-eax-and 0x23/imm32/pound 75/jump-if-!= break/disp8 - # in->read = in->write # skip rest of in - 8b/-> *esi 0/r32/eax - 89/<- *(esi+4) 0/r32/eax - # return + # return eof e9/jump $next-mu-token:done/disp32 } { @@ -3220,7 +3216,11 @@ $parse-mu-block:line-loop: 81 7/subop/compare *ecx 0/imm32 0f 84/jump-if-= break/disp32 # word-slice = next-word(line) - (next-word %ecx %edx) + (next-word %ecx %edx) # We can't use next-mu-token here because of an ambiguity that has crept into our grammar. + # Colons are used to separate variable names from types. For example, `n: int`. Here the colon needs to be a separate word. + # Colons are also used to designate a label. Here the colon needs to be the final letter of a word. + # Maybe I should just disallow spaces before colons in all situations. + # Or be consistent and allow allow space before label name and colon. #? (write-buffered Stderr "word: ") #? (write-slice-buffered Stderr %edx) #? (write-buffered Stderr Newline) @@ -3397,7 +3397,7 @@ check-no-tokens-left: # line: (addr stream byte) 68/push 0/imm32/start 89/<- %ecx 4/r32/esp # - (next-word *(ebp+8) %ecx) + (next-mu-token *(ebp+8) %ecx) # if slice-empty?(s) return (slice-empty? %ecx) 3d/compare-eax-and 0/imm32 @@ -3489,7 +3489,7 @@ parse-mu-var-def: # line: (addr stream byte), vars: (addr stack (handle var)) - 68/push 0/imm32/start 89/<- %ecx 4/r32/esp # var v/edx: (handle var) = parse-var-with-type(line) - (next-word *(ebp+8) %ecx) + (next-mu-token *(ebp+8) %ecx) (parse-var-with-type %ecx *(ebp+8)) # => eax 89/<- %edx 0/r32/eax # v->stack-offset = *Next-local-stack-offset @@ -3516,7 +3516,7 @@ parse-mu-var-def: # line: (addr stream byte), vars: (addr stack (handle var)) - { 74/jump-if-= break/disp8 # ensure that the next word is '<-' - (next-word *(ebp+8) %ecx) + (next-mu-token *(ebp+8) %ecx) (slice-equal? %ecx "<-") # => eax 3d/compare-eax-and 0/imm32 74/jump-if-= $parse-mu-var-def:abort/disp8 |