93 lines
2 KiB
Text
93 lines
2 KiB
Text
#>
|
|
newsyntax
|
|
@in:PE
|
|
@token:bf
|
|
@PE:"function(Stack){
|
|
this.TestNext(Stack,\"Paren\",\"TK_POPEN\");
|
|
this.Move(Stack,2);
|
|
let Check = function(t,v){
|
|
return AST.IsPreciseToken(Stack.Token,t,v);
|
|
}
|
|
let Write = function(v){
|
|
AST.ChunkWrite(Stack,v);
|
|
}
|
|
this.OpenChunk(Stack);
|
|
while(!this.IsPreciseToken(Stack.Token,\"Paren\",\"TK_PCLOSE\")){
|
|
if(Check(\"None\",\"TK_DOT\")){
|
|
Write(\"output\");
|
|
}else if(Check(\"None\",\"TK_COMMA\")){
|
|
Write(\"input\");
|
|
}else if(Check(\"Operator\",\"TK_ADD\")){
|
|
Write(\"inc\");
|
|
}else if(Check(\"Operator\",\"TK_SUB\")){
|
|
Write(\"deinc\");
|
|
}else if(Check(\"Compare\",\"TK_GT\")){
|
|
Write(\"meminc\");
|
|
}else if(Check(\"Compare\",\"TK_LT\")){
|
|
Write(\"memdeinc\");
|
|
}else if(Check(\"Brace\",\"TK_IOPEN\")){
|
|
this.OpenChunk(Stack);
|
|
}else if(Check(\"Brace\",\"TK_ICLOSE\")){
|
|
this.CloseChunk(Stack);
|
|
}
|
|
this.Next(Stack);
|
|
}
|
|
this.CloseChunk(Stack);
|
|
if(!this.CheckNext(Stack,\"None\",\"TK_LINEEND\")&&!this.CheckNext(Stack,\"None\",\"TK_COMMA\")){
|
|
this.Next(Stack);
|
|
this.ChunkWrite(Stack,this.ParseExpression(Stack));
|
|
}
|
|
}"
|
|
@Interpret:"function(AST,Token){
|
|
let BF = Token[3];
|
|
let Chunk = BF[0];
|
|
let Input = BF[1];
|
|
if(Input){
|
|
Input=this.Parse(AST,Input);
|
|
}
|
|
let IPos=0;
|
|
let Memory = [],MemPos=0;
|
|
let UpdateMemory = function(){
|
|
if(Memory[MemPos]===undefined){
|
|
Memory[MemPos]=0;
|
|
}
|
|
}
|
|
let Read = function(v){
|
|
if(v==\"output\"){
|
|
AST.LibGlobals.log(Memory[MemPos]);
|
|
}else if(v==\"input\"){
|
|
Memory[MemPos]=Input.charCodeAt(IPos)||0;
|
|
IPos++;
|
|
}else if(v==\"inc\"){
|
|
UpdateMemory();
|
|
Memory[MemPos]++;
|
|
}else if(v==\"deinc\"){
|
|
UpdateMemory();
|
|
Memory[MemPos]--;
|
|
}else if(v==\"meminc\"){
|
|
MemPos++;
|
|
UpdateMemory();
|
|
}else if(v==\"memdeinc\"){
|
|
MemPos--;
|
|
UpdateMemory();
|
|
}else if(v instanceof Array){
|
|
UpdateMemory();
|
|
while(Memory[MemPos]!=0){
|
|
for(let vv of v){
|
|
Read(vv);
|
|
}
|
|
UpdateMemory();
|
|
}
|
|
}
|
|
}
|
|
UpdateMemory();
|
|
for(let v of Chunk){
|
|
Read(v);
|
|
}
|
|
UpdateMemory();
|
|
return Memory[MemPos];
|
|
}"
|
|
<#
|
|
|
|
set x = bf ( + + + > + + [ < + > - ] < );
|
|
log(x);
|