2016-12-06 61 views
-2

我目前正在制作一个brainf * ck并遇到了循环问题。Brainf * ck解释器循环问题

我遵循this的一些建议,但我似乎无法得到它的工作。

这是到目前为止我的代码:

<html> 
<body> 
<font face="consolas"> 
<script> 
var brPos = 0; 
var k = 0; 
var loop = []; 
var printtape = ""; 
var out = ""; 
var i = 0; 
var pointer = 0; 
var tape = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]; 
var source = prompt("Code").split(""); 
while (i<source.length+1){ 
    if (source[i] == "<"){ 
     pointer--; 
    } else if (source[i] == ">"){ 
     pointer++; 
    } else if (source[i] == "+"){ 
     tape[pointer]++; 
    } else if (source[i] == "-"){ 
     tape[pointer]--; 
    } else if (source[i] == ","){ 
     tape[pointer] = prompt("Input").charCodeAt(0); 
    } else if (source[i] == "."){ 
     out += String.fromCharCode(tape[pointer]); 
    } else if (source[i] == "["){ 
     loop.push(pointer); 
     if (tape[pointer] == 0){ 
      brPos = i; 
      while (k >= 0) { 
       if (source[brPos] == "[") { 
        k++; 
       } else if (source[brPos] == "]") { 
        k--; 
       } 
      } 
      i = brPos; 
      brPos = 0; 
      loop.pop(); 
     } 
    } else if (source[i] == "]"){ 
     i=loop[loop.length-1]; 
    } 
    i++; 
    for (j=0;j<tape.length;j++) { 
     if (tape[j] > 255) { 
      tape[j] = 0; 
     } else if (tape[j] < 0) { 
      tape[j] = 255; 
     } 
    } 
    console.log(tape); 
    console.log(loop); 
} 
printtape = ""; 
printtape += "|"; 
for (i=0;i<tape.length;i++) { 
    if (tape[i]<10) { 
     printtape += "00"+tape[i]+"|"; 
    } 
    if (tape[i]>=10&&tape[i]<100) { 
     printtape += "0"+tape[i]+"|"; 
    } 
    if (tape[i]>=100) { 
     printtape += tape[i]+"|"; 
    } 
} 
printtape += "<br>"; 
printtape += "  "; 
for (i=0;i<pointer;i++) { 
    printtape += "    "; 
} 
printtape += "^"; 
document.write(printtape); 
alert(out); 
</script> 
</font> 
</body> 
</html> 

这是有问题的代码(我认为):

} else if (source[i] == "["){ 
    loop.push(pointer); 
    if (tape[pointer] == 0){ 
     brPos = i; 
     while (k >= 0) { 
      if (source[brPos] == "[") { 
       k++; 
      } else if (source[brPos] == "]") { 
       k--; 
      } 
     } 
     i = brPos; 
     brPos = 0; 
     loop.pop(); 
    } 
} else if (source[i] == "]"){ 
    i=loop[loop.length-1]; 
} 

当我与一个brainf * CK循环运行的代码(IE)在它,它不结束while循环,并最终崩溃,我不知道为什么。

P.S.我知道在评论中有人会说<font>标记是无效的HTML,我应该使用CSS,但它的工作原理,它比CSS快,我真的不在乎。

+0

问题是什么(除了不工作)? –

+0

它永远运行,似乎并没有结束while循环。 – FinW

回答

1

关于Brainfuck解析没有任何我知道的,但代码逻辑失败,并且您得到无限循环,因为brPos是循环内的常量。你进行相同的比较,并重复一次又一次到达k++brPos必须改变,如果你想离开那里。