Brainf*** Interpreter

From Second Life Wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

(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

<lsl> // 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;        
   }  

} </lsl>