Execute Brain****/ALGOL 68: Difference between revisions

From Rosetta Code
Content added Content deleted
m (RCBF (ALGOL 68) moved to RCBF/ALGOL 68: MW has page hierarchy support. (Who'da thunk it?))
m (Categorization now in master page)
Line 1: Line 1:
{{implementation|Brainf***}}{{collection|RCBF}}
{{implementation|Brainf***}}{{collection|RCBF}}

=={{header|ALGOL 68}}==
An implementation of BF for Rosetta Code.
An implementation of BF in [[ALGOL 68]] for Rosetta Code.
MODE BYTE = SHORT SHORT SHORT INT;
<lang algol68>MODE BYTE = SHORT SHORT SHORT INT;
MODE CADDR = BYTE; # code address #
MODE CADDR = BYTE; # code address #
Line 60: Line 60:
FOR i TO UPB code list DO byte code list[i] := ABS code list[i] OD;
FOR i TO UPB code list DO byte code list[i] := ABS code list[i] OD;
run(byte code list)
run(byte code list)</lang>

Revision as of 20:00, 30 December 2009

Execute Brain****/ALGOL 68 is an implementation of Brainf***. Other implementations of Brainf***.
Execute Brain****/ALGOL 68 is part of RCBF. You may find other members of RCBF at Category:RCBF.

An implementation of BF in ALGOL 68 for Rosetta Code. <lang algol68>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
              FOR new addr FROM code addr + 1 WHILE
                code addr := new addr;
                code list[new addr] /= ABS "]"
              DO SKIP OD
            FI,
    # ] # VOID:
            IF data list[data addr] /= zero THEN
              FOR new addr FROM code addr - 1 BY -1 WHILE
                code addr := new addr;
                code list[new addr] /= ABS "["
              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)</lang>