⚠️ 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}}

An implementation of BF in [[ALGOL 68]] for Rosetta Code.

MODE BYTE = SHORT SHORT SHORT INT;

 MODE CADDR = BYTE; # code address #
 MODE OPCODE = BYTE;
 OPCODE nop = 0;

 MODE DADDR = BYTE; # data address #
 MODE DATA = BYTE;
 DATA zero = 0;

 PROC run = ([] OPCODE code list)VOID:(
   [-255:255]DATA data list;  # finite data space #
   FOR i FROM LWB data list TO UPB data list DO data list[i] := zero OD;

   DADDR data addr := ( UPB data list + LWB data list ) OVER 2;
   CADDR code addr := LWB code list;

   [0:127]OPCODE assembler; # 7 bit ascii only #

   STRING op code list="><+-.,[]";
   []PROC VOID op list= []PROC VOID(
     # ? # VOID: SKIP, # NOP #
     # > # VOID: data addr +:= 1,
     # < # VOID: data addr -:= 1,
     # + # VOID: data list[data addr] +:= 1,
     # - # VOID: data list[data addr] -:= 1,
     # . # VOID: print(REPR data list[data addr]),
     # , # VOID: data list[data addr]:=ABS read char,
     # [ # VOID:
             IF data list[data addr] = zero THEN
               # skip to the end of the loop, allowing for nested loops #
               INT br level := 0;
               WHILE
                 IF   code list[code addr] = ABS "["
                 THEN
                   br level +:= 1;
                 ELIF code list[code addr] = ABS "]"
                 THEN
                   br level -:= 1
                 FI;
                 IF br level > 0
                 THEN
                   code addr +:= 1;
                   TRUE
                 ELSE
                   FALSE
                 FI
               DO SKIP OD
             FI,
     # ] # VOID:
             IF data list[data addr] /= zero THEN
               # skip to the start of the loop, allowing for nested loops #
               INT br level := 0;
               WHILE
                 IF   code list[code addr] = ABS "["
                 THEN
                   br level +:= 1
                 ELIF code list[code addr] = ABS "]"
                 THEN
                   br level -:= 1
                 FI;
                 code addr -:= 1;
                 br level < 0
               DO SKIP OD
             FI
   )[:@0];

   FOR op TO UPB assembler DO assembler[op] := nop OD; # insert NOP #
   FOR op TO UPB op code list DO assembler[ABS op code list[op]] := op OD;

   WHILE code addr <= UPB code list DO
     op list[ABS assembler[ABS code list[code addr]]];
     code addr +:= 1
   OD
 );

 STRING code list := "++++++[>+++++++++++<-]>-."; # print the ascii letter A #

 [UPB code list]BYTE byte code list; # convert to bytes #
 FOR i TO UPB code list DO byte code list[i] := ABS code list[i] OD;

 run(byte code list)