diff options
author | tomsmeding <hallo@tomsmeding.nl> | 2015-08-22 09:59:55 +0200 |
---|---|---|
committer | tomsmeding <hallo@tomsmeding.nl> | 2015-08-22 10:00:38 +0200 |
commit | 7fab11f595d7c75ad4f859fb9af9d06b931a1b14 (patch) | |
tree | 3716126d7c402f4ceddc832f61905776ec7084db | |
parent | 28a403355894f378c87c01043365b85b69737546 (diff) |
Fully working BF interpreter :tada:
-rw-r--r-- | bf.prn | 85 |
1 files changed, 66 insertions, 19 deletions
@@ -1,21 +1,36 @@ -10000 "TAPELEN" store +200 "TAPELEN" store ##First, read in the source -"" -1 while - getline - dup -1 = if - pop - 0 - else - "\n" swap + + - 1 - end +# "" +# 1 while +# getline +# dup -1 = if +# pop +# 0 +# else +# "\n" swap + + +# 1 +# end +# end +# strlen 1 swap substr swap pop +# #bottom of stack now contains 1 string, the source code +# strlen "len" store +# "code" store + +argc 1 = ! if + "Please give the brainfuck file as a command-line argument." print lf + exit end -strlen 1 swap substr swap pop -#bottom of stack now contains 1 string, the source code +0 argvget "r" fopen "filehandle" store +"" +filehandle fgetc +dup -1 = ! while + + + filehandle fgetc +dup -1 = ! end +pop strlen "len" store "code" store @@ -46,27 +61,59 @@ dup 0 > while "code" depth + dup swapoutvar i stridx "c" store swap store #uses the dupped name before the matching swapoutvar - #"c = " c + print lf + #"c = " c + print stackdump + c "#" = if stackdump end c "+" = if 1 + 256 % end c "-" = if 255 + 256 % end c "." = if dup chr print end - c "," = if pop getc ord 256 % end - c ">" = if 1 roll end - c "<" = if -1 roll end + c "," = if + pop + getc + dup -1 = if + pop 255 + else + ord 256 % + end + #{}"Input put on stack " print dup print lf + end + c ">" = if -1 roll end + c "<" = if 1 roll end c "]" = if i "loopend" depth 1 - + store - len "i" store #essentially, break + len "i" store # == break end c "[" = if i "loopstart" depth + store #"loopstart" print depth print " = " print "loopstart" depth + get print lf + 0 "didloop" depth + store dup while + 1 "didloop" depth + store "code" depth + swapoutvar i 1 + len substr swap "code" depth + store execute #stackdump "i = " print i print lf "loopstart" depth + get "i" store dup end - "loopend" depth + get 1 + "loopstart" depth + get + "i" store + "didloop" depth + get ! if + 1 "searchdepth" store + i 1 + "i" store + "code" depth + dup swapoutvar + i len < searchdepth 0 > * while + i stridx "c" store + #"Searching index " print i print " (char " print c print ")" print lf + c "[" = if searchdepth 1 + "searchdepth" store end + c "]" = if searchdepth 1 - "searchdepth" store end + i 1 + "i" store + i len < searchdepth 0 > * end + #stackdump + swap store + searchdepth 0 = ! if + "No matching ']' found for '[' at index " print loopstart print lf + exit + end + i 1 - "i" store + else + "loopend" depth + get 1 + "loopstart" depth + get + "i" store + end #"after loop, i = " print i print lf end |