Execute Brain****/ALGOL 68: Difference between revisions
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. |
||
<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>