Paste: a BF interpreter
Author: | gasche |
Mode: | factor |
Date: | Sat, 23 Apr 2011 19:59:08 |
Plain Text |
USING:
kernel sequences arrays lists locals assocs
strings combinators accessors io math math.parser ;
IN: essais
TUPLE: data
{ mem read-only }
mem-pos
;
TUPLE: program
{ code read-only }
{ jump-table read-only }
code-pos
;
: jump-table[
swons ;
: jump-table]
swap
dup nil? [ "too much ] brackets" throw ] when
unswons
[| table index stack [pos
| table stack
[pos index table set-nth
index [pos table set-nth
] call
;
: jump-table-char
swap 1string {
{ "[" [ jump-table[ ] }
{ "]" [ jump-table] ] }
[ 2drop ]
} case
;
: <jump-table>
dup length f <array>
nil
rot [ jump-table-char ] each-index
nil? not [ "too much [ brackets" throw ] when
;
: <data>
512 0 <array> 0 data boa ;
: <program>
dup <jump-table> 0 program boa ;
: data-change-mem
[ dup [ mem-pos>> ] [ mem>> ] bi ] dip change-nth
; inline
: program+
[ [ 1 + ] data-change-mem ] dip ;
: program-
[ [ 1 - ] data-change-mem ] dip ;
: program>
[ [ 1 + ] change-mem-pos ] dip ;
: program<
[ [ 1 - ] change-mem-pos ] dip ;
: data-mem-0?
[ mem-pos>> ] [ mem>> ] bi nth 0 = ;
: program-jump-pos
dup code-pos>>
over jump-table>> nth
>>code-pos
;
: program[
over data-mem-0? [ program-jump-pos ] when ;
: program]
over data-mem-0? not [ program-jump-pos ] when ;
: program,
"input: " print
over readln string>number swap
[ mem-pos>> ] [ mem>> ] bi set-nth
;
: program.
over [ mem-pos>> ] [ mem>> ] bi nth number>string print ;
: program-step
dup [ code-pos>> ] [ code>> ] bi nth
1string {
{ "+" [ program+ ] }
{ "-" [ program- ] }
{ "<" [ program< ] }
{ ">" [ program> ] }
{ "[" [ program[ ] }
{ "]" [ program] ] }
{ "," [ program, ] }
{ "." [ program. ] }
[ drop ]
} case
[ 1 + ] change-code-pos
;
: program-stop?
[ code-pos>> ] [ code>> length ] bi = ;
: program-run
[ dup program-stop? ] [ program-step ] until ;
Author: | gasche |
Mode: | factor |
Date: | Sun, 24 Apr 2011 07:45:27 |
Plain Text |
: program-jump-pos
dup [ code-pos>> ] [ jump-table>> ] bi nth >>code-pos ;
New Annotation