⚠️ Warning: This is a draft ⚠️

This means it might contain formatting issues, incorrect code, conceptual problems, or other severe issues.

If you want to help to improve and eventually enable this page, please fork RosettaGit's repository and open a merge request on GitHub.

{{implementation|Brainfuck}}{{collection|RCBF}} A Brainfuck compiler written by [[User:IanOsgood|Ian Osgood]] in [[Forth]].

==Usage==

Load the code your preferred Forth environment. The code will define the words ''':bf''' and ''':bf-file''', ===Compiling Brainfuck code=== Let's say you have this sequence that prints a capital A: ++++++[>+++++++++++<-]>-. You can compile it by using the ''':bf''' word: :bf printA " ++++++[>+++++++++++<-]>-." Your Brainfuck code is now compiled in your Forth environment as the word '''printA'''. If you want to use a different name, replace printA with your preferred name.

Larger BF programs may be loaded from a file instead of parsed from the interpreter: :bf-file bottles bottles.bf

===Running the compiled Brainfuck code=== Assuming you used the word '''printA''' from the above example, you can execute your code by running the word: printA

==Source== Tested in: [[GNU Forth]]


\ brainfuck compiler

1024 constant size
: init  ( -- p *p ) here size erase  here 0 ;
: right ( p *p -- p+1 *p ) over c!  1+  dup c@ ;
: left  ( p *p -- p-1 *p ) over c!  1-  dup c@ ;		\ range check?

: compile-bf-char ( c -- )
  case
  [char] [ of postpone begin
              postpone dup
              postpone while  endof
  [char] ] of postpone repeat endof
  [char] + of postpone 1+     endof
  [char] - of postpone 1-     endof
  [char] > of postpone right  endof
  [char] < of postpone left   endof
  [char] , of postpone drop
              postpone key    endof
  [char] . of postpone dup
              postpone emit   endof
    \ ignore all other characters
  endcase ;

: compile-bf-string ( addr len -- )
  postpone init
  bounds do i c@ compile-bf-char loop
  postpone swap
  postpone c!
  postpone ;
;

: :bf ( name " bfcode" -- )
  :
  char parse    \ get string delimiter
  compile-bf-string ;

: :bf-file ( name file -- )
  :
  bl parse slurp-file
  compile-bf-string ;