Edit this page

bf interpreter

Here's a simple hello world program you can use to test it:

++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.


variable cur
create buf 2000 allot

variable src-cur
variable src-size
create src 200 allot

create find-buf cell allot
2 find-buf c!
: findc find-buf 1 + 2dup 1 + c! c! find-buf find ;
: src-size++ src-size @ 1 + src-size ! ;
: src-cur-- src-cur @ 1 - src-cur ! ;
: src++@ src-cur @ 1 + dup src-cur ! c@ ;
: ?[ [char] [ = if 1 - then ;
: ?] [char] ] = if 1 + then ;

: scan-back
   begin
      src-cur-- src-cur @ c@ dup >r ?] r> ?[ dup 0= if exit then
   again
;

: ++ cur @ @ 1 + cur @ ! ;
: -- cur @ @ 1 - cur @ ! ;
: >> cur @ cell + cur ! ;
: << cur @ cell - cur ! ;
: .. cur @ @ emit ;
: [[ ;
: ]] cur @ @ if 1 scan-back drop then ;

: src-push src src-size @ + c! src-size++ ;

: readline
   cr begin
      key dup emit dup 13 = if drop cr exit then src-push
   again
;

: init src 1 - src-cur ! buf cur ! 0 src-size ! buf 2000 0 fill ;

: done? src-cur @ 1 + src src-size @ + = ;

: bf-run
   begin
      done? if exit then src++@ findc
      if
         execute
      else
         [char] ? emit drop
      then
   again
;

: main begin init readline bf-run again ;

.( Press esc to exit)
cr cr
main

See Also

Forth Code

Forth

Edit this page · home ·