Execute Brain****/Elena: Difference between revisions

From Rosetta Code
Content added Content deleted
No edit summary
No edit summary
Line 1: Line 1:
<lang elena>#import system.
<lang elena>#import system'collections.
#import system'collections.
#import system'routines.
#import system'routines.
#import system'dynamic.
#import system'dynamic.

Revision as of 20:02, 24 March 2017

<lang elena>#import system'collections.

  1. import system'routines.
  2. import system'dynamic.
  1. import extensions.
  2. import extensions'scripting.

class BFTape {

   object theArray.
   object thePointer.
   object theBrackets.
   constructor new:aLength
   [
       theArray := Array new:aLength set &every: (&int:n) [ Integer new:0 ].
       
       thePointer := Integer new:0.
       
       theBrackets := Stack new.
   ]
   append
   [
        (theArray@thePointer) += 1.
   ]
   
   reduce
   [
        (theArray@thePointer) -= 1.
   ]
   
   next
   [
       thePointer += 1.
   ]
   previous
   [
       thePointer -= 1.
   ]
   
   push : bookmark
   [
       theBrackets push:bookmark.
   ]
   
   pop
       => theBrackets.
   
   input
   [
       theArray@thePointer := console readChar toInt.
   ]
   
   output
   [
       console write:((theArray@thePointer) toChar).
   ]
   check = theArray@thePointer != 0.

}

program = [

   console 
      writeLine:"++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.".
                             
   var program := scriptEngine 
       load &path:"rules.es"
       eval:"++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.".
   program eval:(BFTape new:1024).

].</lang> The grammar: <lang elena>[[ [[

  #grammar transform
  #grammar cf
  #define start      ::= <= ( > += " 2" += " %""system'dynamic'tapeOp.var&args$[]""" => commands <= " *" "system'dynamic'Tape" "=" == ) =>;
  #define commands   ::= command commands;
  #define commands   ::= comment commands;
  #define commands   ::= $eof;
  #define command    ::= <= += " %""output[0]"" " => ".";
  #define command    ::= <= += " %""input[0]"" " => ",";
  #define command    ::= <= += " %""previous[0]"" " => "<";
  #define command    ::= <= += " %""next[0]"" " => ">";
  #define command    ::= <= += " %""append[0]"" " => "+";
  #define command    ::= <= += " %""reduce[0]"" " => "-";
  #define command    ::= <= += " -2" += " %""system'dynamic'tapeOp.ptr&args$[]"" " += " 1" += " %""system'dynamic'tapeOp.stack&args$[]"" " 
                         += "%""push[1]"" " => "[";
  #define command    ::= <= += " 0" += " %""system'dynamic'tapeOp.stack&args$[]"" " += " %""check[0]"" " += " 1" += " 
                         %""system'dynamic'tapeOp.stack&args$[]"" " += " %""pop[0]"" " += " %""system'dynamic'tapeOp.jumpif&args$[13]"" " => "]";
  #define comment    ::= " " comments;
  #define comment    ::= "'" comments;
  #define comment    ::= "!" comments;
  #define comment    ::= $eol;
  #define comments   ::= $chr comments;
  #define comments   ::= $eps;
  #mode symbolic;

]]

]]</lang>