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

no edit summary
No edit summary
No edit summary
Line 1:
<lang elena>#import system'collections.
#import system'routines.
#import system'dynamic.
 
#import extensions.
#import extensions'scripting.
 
class BFTape
{
Line 11:
object thePointer.
object theBrackets.
 
constructor new:aLength
[
theArray := Array new:aLength; set &every: populate(&int:n) [ Integer new:0 ].
thePointer := Integer new:0.
theBrackets := Stack new.
]
 
append
[
(theArray@[thePointer) +=] append:1.
]
reduce
[
(theArray@[thePointer) -=] reduce:1.
]
next
[
thePointer += append:1.
]
 
previous
[
thePointer -= reduce:1.
]
push : bookmark
[
theBrackets push:bookmark.
]
pop
=> theBrackets.
input
[
theArray@[thePointer] := console readChar; toInt.
]
output
[
console write:((theArray@[thePointer)] toChar).
]
 
check = theArray@[thePointer] != 0.
}
 
const bf_program = eval:"++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.".
program =
[
console
writeLine:bf_program.
writeLine:"++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.".
var program := scriptEngine
load &path:"rules.es";
eval:bf_program.
eval:"++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.".
 
program eval:(BFTape new:1024).
].</lang>
The grammar:
<lang elena>[[
[[
#grammar transform
#grammar cf
 
#define start ::= <= ( > += " 2" += " %""system'dynamic'tapeOp.var&args$tape_var[]""" => commands <= " *" "system'dynamic'Tape" "=" ==# ) =>;
 
#define commands ::= command commands;
Line 91 ⟶ 92:
#define command ::= <= += " %""append[0]"" " => "+";
#define command ::= <= += " %""reduce[0]"" " => "-";
#define command ::= <= += " -2" += " %""system'dynamic'tapeOp.ptr&args$tape_ptr[]"" " += " 1" += " %""system'dynamic'tapeOp.stack&args$tape_stack[]"" " += "%""push[1]"" " => "[";
#define command ::= <= += " 0" += " %""system'dynamic'tapeOp.tape_stack[]"" " += " %""check[0]"" " += " 1" += " %""system'dynamic'tapeOp.stack&args$tape_stack[]"" " += " %""pop[0]"" " += " %""system'dynamic'tapeOp.jumpif&args$tape_jumpif[13]"" " => "]";
+= "%""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;
Line 105 ⟶ 104:
 
#mode symbolic;
]]
 
]]</lang>
{{out}}
<pre>
ELENA VM 3.2.15 (C)2005-2017 by Alex Rakov
Initializing...
Debug mode...
Done...
writeLine:"++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.".
Hello World!
</pre>
Anonymous user