Execute Brain****/Elena: Difference between revisions
Content added Content deleted
No edit summary |
No edit summary |
||
Line 5: | Line 5: | ||
import extensions. |
import extensions. |
||
import extensions'scripting. |
import extensions'scripting. |
||
import extensions'dynamic'expressions. |
|||
class BFTape |
|||
class TapeAssembler |
|||
{ |
|||
{ |
|||
object theArray. |
|||
stack theBrackets. |
|||
object thePointer. |
|||
list<TapeExpression> theTape. |
|||
object theBrackets. |
|||
constructor new |
constructor new |
||
[ |
[ |
||
theArray := Array new:aLength; populate(:n) [ Integer new:0 ]. |
|||
thePointer := Integer new:0. |
|||
theBrackets := Stack new. |
theBrackets := Stack new. |
||
theTape := list<TapeExpression>(). |
|||
theTape append(TapeExpression Declaring("ptr")). |
|||
theTape append(TapeExpression Assigning("ptr", TapeExpression Constant(0))). |
|||
] |
] |
||
constructor new : assembly_program |
|||
append |
|||
<= new; |
|||
[ |
[ |
||
assembly_program($self). |
|||
] |
|||
open |
|||
[ |
|||
theBrackets push(theTape). |
|||
theTape := list<TapeExpression>(). |
|||
] |
] |
||
close |
|||
[ |
|||
var loop := TapeExpression Loop( |
|||
TapeExpression MessageCall( |
|||
TapeExpression MessageCall( |
|||
TapeExpression Variable("tape"), |
|||
"getAt", |
|||
TapeExpression Variable("ptr") |
|||
), |
|||
"notequal", |
|||
TapeExpression Constant($0)), |
|||
TapeExpression Code(theTape array)). |
|||
theTape := theBrackets pop. |
|||
theTape append(loop). |
|||
] |
|||
input |
|||
[ |
|||
theTape append(TapeExpression MessageCall( |
|||
TapeExpression Variable("tape"), |
|||
"setAt", |
|||
TapeExpression Variable("ptr"), |
|||
TapeExpression MessageCall( |
|||
TapeExpression Constant(console), |
|||
"readChar" |
|||
))). |
|||
] |
|||
output |
|||
[ |
[ |
||
theTape append(TapeExpression MessageCall( |
|||
theArray[thePointer] reduce:1. |
|||
TapeExpression Constant(console), |
|||
"write", |
|||
TapeExpression MessageCall( |
|||
TapeExpression Variable("tape"), |
|||
"getAt", |
|||
TapeExpression Variable("ptr") |
|||
))). |
|||
] |
] |
||
next |
next |
||
[ |
[ |
||
theTape append(TapeExpression Assigning( |
|||
"ptr", |
|||
TapeExpression MessageCall( |
|||
TapeExpression Variable("ptr"), |
|||
"add", |
|||
TapeExpression Constant(1)))). |
|||
] |
] |
||
previous |
previous |
||
[ |
[ |
||
theTape append(TapeExpression Assigning( |
|||
thePointer reduce:1. |
|||
"ptr", |
|||
TapeExpression MessageCall( |
|||
TapeExpression Variable("ptr"), |
|||
"subtract", |
|||
TapeExpression Constant(1)))). |
|||
] |
] |
||
increase |
|||
[ |
[ |
||
theTape append(TapeExpression MessageCall( |
|||
theBrackets push:bookmark. |
|||
TapeExpression Variable("tape"), |
|||
"setAt", |
|||
TapeExpression Variable("ptr"), |
|||
TapeExpression MessageCall( |
|||
TapeExpression Constant(CharValue), |
|||
"new", |
|||
TapeExpression MessageCall( |
|||
TapeExpression MessageCall( |
|||
TapeExpression Constant(convertor), |
|||
"toInt", |
|||
TapeExpression MessageCall( |
|||
TapeExpression Variable("tape"), |
|||
"getAt", |
|||
TapeExpression Variable("ptr")) |
|||
), |
|||
"add", |
|||
TapeExpression Constant(1))))). |
|||
] |
] |
||
decrease |
|||
=> theBrackets. |
|||
input |
|||
[ |
[ |
||
theTape append(TapeExpression MessageCall( |
|||
theArray[thePointer] := console readChar; toInt. |
|||
TapeExpression Variable("tape"), |
|||
"setAt", |
|||
TapeExpression Variable("ptr"), |
|||
TapeExpression MessageCall( |
|||
TapeExpression Constant(CharValue), |
|||
"new", |
|||
TapeExpression MessageCall( |
|||
TapeExpression MessageCall( |
|||
TapeExpression Constant(convertor), |
|||
"toInt", |
|||
TapeExpression MessageCall( |
|||
TapeExpression Variable("tape"), |
|||
"getAt", |
|||
TapeExpression Variable("ptr")) |
|||
), |
|||
"subtract", |
|||
TapeExpression Constant(1))))). |
|||
] |
] |
||
get |
|||
[ |
[ |
||
var program := TapeExpression Singleton( |
|||
console write(theArray[thePointer] toChar). |
|||
TapeExpression Method( |
|||
"eval", |
|||
TapeExpression Code(theTape array), |
|||
TapeExpression Parameter("tape"))). |
|||
var o := (program compiled)(). |
|||
^(:tape) [ o eval(tape) ] |
|||
] |
] |
||
check = theArray[thePointer] != 0. |
|||
} |
} |
||
Line 68: | Line 159: | ||
console |
console |
||
writeLine:bf_program. |
writeLine:bf_program. |
||
var |
var bfAssemblyProgram := scriptEngine |
||
load path:" |
load path:"asmrules.es"; |
||
eval |
eval(bf_program). |
||
var bfProgram := TapeAssembler new(bfAssemblyProgram); get. |
|||
program eval:(BFTape new:1024). |
|||
var bfTape := Array new:1024; populate(:n)<int>($0). |
|||
bfProgram(bfTape). |
|||
].</lang> |
].</lang> |
||
The grammar: |
The grammar: |
||
Line 80: | Line 175: | ||
#grammar cf |
#grammar cf |
||
#define start ::= <= ( > |
#define start ::= <= ( > => commands <= " * system'dynamic'ClosureTape= " # ) =>; |
||
#define commands ::= command commands; |
#define commands ::= command commands; |
||
Line 86: | Line 181: | ||
#define commands ::= $eof; |
#define commands ::= $eof; |
||
#define command ::= <= += " %""output[0]"" " => "."; |
#define command ::= <= += " %""output[0]"" system'dynamic'MessageClosure ^""new[1]"" " => "."; |
||
#define command ::= <= += " %""input[0]"" " => ","; |
#define command ::= <= += " %""input[0]"" system'dynamic'MessageClosure ^""new[1]"" " => ","; |
||
#define command ::= <= += " %""previous[0]"" " => "<"; |
#define command ::= <= += " %""previous[0]"" system'dynamic'MessageClosure ^""new[1]"" " => "<"; |
||
#define command ::= <= += " %""next[0]"" " => ">"; |
#define command ::= <= += " %""next[0]"" system'dynamic'MessageClosure ^""new[1]"" " => ">"; |
||
#define command ::= <= += " %"" |
#define command ::= <= += " %""increase[0]"" system'dynamic'MessageClosure ^""new[1]"" " => "+"; |
||
#define command ::= <= += " %"" |
#define command ::= <= += " %""decrease[0]"" system'dynamic'MessageClosure ^""new[1]"" " => "-"; |
||
#define command ::= <= |
#define command ::= <= += " %""open[0]"" system'dynamic'MessageClosure ^""new[1]"" " => "["; |
||
#define command ::= <= |
#define command ::= <= += " %""close[0]"" system'dynamic'MessageClosure ^""new[1]"" " => "]"; |
||
#define comment ::= " " comments; |
#define comment ::= " " comments; |