Skip to content
lsl.devlsl.devLSL Dev

Brainf*** Interpreter

(http://www.gnu.org/copyleft/fdl.html) in the spirit of which this script is GPL'd. Copyright (C) 2013 Subus Tremor
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
This is an esoteric language - that implies a useless programming language (except for the fun of it).
It interprets correct Brainf*** code.
There is no debugging etc. provided.
Create a box, and drop this script in it. Then edit the script and assign a valid Brainf*** program code to variable program.
Save the script and touch your box to run the code
// The esoteric computer language Brainf*** - Interpreter for SL by Subus Tremor
//
// Data to the Interpreter - replace the string by any valid Brainf*** program
// if it's a valid progam AND has correct syntax AND does not run out of space -
// then it runs :-) otherwise not :-( have fun.

//sample program1
string program1 = "Hello World program
++++++++++ initialize
[ start loop
>+++++++>++++++++++>+++>+<<<<- set some values
] end loop
>++. H out
>+. e out
+++++++. l out
. l out
+++. o out
>++. blank out
<<+++++++++++++++. W out
>. o out
+++. r out
------. l out
--------. d out
>+. ! out
>. lineend 
";

//sample program2
string program2 = "this brainf*** program asks for your name and then greets you
>+++++++++++[<++++++++>-]<-.>++++[<++++>-]<+.-------.>+++++
[<++++>-]<-.[-]>++++++++[<++++>-]<.>+++++++++[<++++++++>-]<
+.++++++++++.[-]>++++++++[<++++>-]<.>+++++++++++[<++++++++>
-]<+.----------.++++++.---.[-]>++++++++[<++++>-]<.>++++++++
+++++[<++++++>-]<.-------------.++++++++++++.--------.>++++
++[<------>-]<--.[-]+++++++++++++.---.[-]+[>,-------------]
>+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.[
-]>++++++++[<++++>-]<.[-]<-[<-]>[++++++++++++++.>]+++++++++
+.";

list input = [82, 117, 116, 104, 13]; // input Ruth (the "name" the program is asking for)
integer n=0;

// The Brainf*** interpreter
integer commandpointer = 0;         //point to 0 at start
string  command = "";               
list  storage = ["0"];              //first storage cell inizialized to 0
integer cellpointer = 0;
integer cell=0;                     

string  bfelements = "+-><[].,";    //the Brainf*** commands
integer pl=0;                       //program lenght
integer pc=0;                       //blockcounter
integer si=0;                       //stackindex
string program;                     //contains the progeam to be interpreted

list blocklist;
integer waitforchar=FALSE;

makeblocklist() { // to avoid searching - loop structure [ ] is evaluated in advance
    integer i=0;
    list stack;
    integer s;
    integer ie = llStringLength(program);
    for(; i < ie; i+=1) {
        if(llGetSubString(program, i, i)=="[") { //begin
        stack = i + stack;        
        }
        if(llGetSubString(program, i, i)=="]") { //end
            if(llGetListLength(stack)>0) {
                s = llList2Integer(stack,0);
                stack = llDeleteSubList(stack,0,0);
                blocklist = blocklist + s + i;
            }  
        }
    }   
}

default
{
    state_entry()
    {
        program=program1;   // assign valid Brainf*** code to the variable program
                            // either program1 or program2 or your own code
        makeblocklist();    // build the loop structure in advance
    }
    touch_start(integer total_number)
    {
        llSay(0,"Interpreter start");
        state interpret;
    }
}

state interpret {
    state_entry() // run the Brainf*** Interpreter
    {
        do { // interpret the Brainf*** code in variable program
            command = llGetSubString( program, commandpointer, commandpointer );
            if(command=="+") { // increment cell at cellpointer
                cell = llList2Integer(storage,cellpointer)+1;
                storage = llListReplaceList(storage, [cell], cellpointer, cellpointer);
            }
            if(command=="-") { // decrement cell at cellpointer
                cell = llList2Integer(storage,cellpointer)-1;
                storage = llListReplaceList(storage, [cell], cellpointer, cellpointer);
            }
            if(command==">") { // point at next cell
                if((llGetListLength(storage)-1)==cellpointer) storage += 0;
                cellpointer+=1;
                cell = llList2Integer(storage,cellpointer);
            }
            if(command=="<") { // point ar previous cell
                cellpointer-=1;
                cell = llList2Integer(storage,cellpointer);
            }
            if(command==".") { // output one character
                cell = llList2Integer(storage,cellpointer);
                llSay(0,llGetSubString(llBase64ToString(llIntegerToBase64((integer)cell << 24)),0,0));
            }
            if(command==",") { // input one character
                if(waitforchar==FALSE) {
                    waitforchar=TRUE;
                    llSay(0,"reading 1 input char now");
                    state waitchar;
                }
                else {
                    waitforchar = FALSE;
                    storage = llListReplaceList(storage, [cell], cellpointer, cellpointer);
                }
            }            
            if(((command=="]")&&(cell!=0))||((command=="[")&&(cell==0))) { // handle loops 
                    integer bindex = llListFindList(blocklist,[commandpointer]);
                    if(command=="[") bindex++; else bindex--;
                    commandpointer = llList2Integer(blocklist, bindex)+1;
            }
            else commandpointer++; // point at next instruction
        } while (commandpointer<llStringLength(program)-1);
        llSay(0,"Interpreter finished");
        llResetScript();
    }
}
state waitchar {
    state_entry() // get inputcharacters, input ends if char hex 13 is detected
    {
        if(n<llGetListLength(input)) {
            cell = llList2Integer(input,n);
            n++;
        }
    state interpret;        
    }  
}
Original wiki source

Some wiki templates and tables need their original context. View this article on the Second Life Wiki. Technical wording and examples are retained from the source; historical guidance may differ from current behavior.