brainfuck.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. var memoryCells = 20;
  2. var memory = new Array();
  3. var currentMemoryPos = 0;
  4. var currentCodePos = 0;
  5. var running = false;
  6. var stopRunning = false;
  7. var memoryTable = document.getElementById("memorytable");
  8. var memoryTableData = "";
  9. for(var i = 0; i < memoryCells; i++)
  10. {
  11. memory[i] = 0;
  12. memoryTableData += "<div id='memorycell" + i + "' class='memorycell'>0</div>";
  13. }
  14. memoryTable.innerHTML = memoryTableData;
  15. document.getElementById("memorycell0").classList.add("active_cell");
  16. function reset()
  17. {
  18. if(running === true)
  19. {
  20. return;
  21. }
  22. currentMemoryPos = 0;
  23. currentCodePos = 0;
  24. var cell = null;
  25. for(var i = 0; i < memoryCells; i++)
  26. {
  27. memory[i] = 0;
  28. cell = document.getElementById("memorycell" + i);
  29. cell.innerHTML = "0";
  30. cell.classList.remove("active_cell");
  31. }
  32. document.getElementById("memorycell0").classList.add("active_cell");
  33. document.getElementById("outputcode").innerHTML = "";
  34. document.getElementById("output").innerHTML = "";
  35. }
  36. function start()
  37. {
  38. if(running === true)
  39. {
  40. stopRunning = true;
  41. return;
  42. }
  43. document.getElementById("start").innerHTML = "Pause";
  44. running = true;
  45. setTimeout(execute, 200);
  46. }
  47. function execute()
  48. {
  49. var code = document.getElementById("input").value;
  50. var output = code.substring(0, currentCodePos) + "<span class='active_code'>" +
  51. code.substring(currentCodePos, currentCodePos + 1) + "</span>" + code.substring(currentCodePos + 1, code.length);
  52. output = output.replace(new RegExp("\n", 'g'), "<br>");
  53. document.getElementById("outputcode").innerHTML = output;
  54. switch(code[currentCodePos])
  55. {
  56. case '>':
  57. document.getElementById("memorycell" + currentMemoryPos).classList.remove("active_cell");
  58. currentMemoryPos = (currentMemoryPos + 1) % memoryCells;
  59. document.getElementById("memorycell" + currentMemoryPos).classList.add("active_cell");
  60. break;
  61. case '<':
  62. document.getElementById("memorycell" + currentMemoryPos).classList.remove("active_cell");
  63. currentMemoryPos = (currentMemoryPos + memoryCells - 1) % memoryCells;
  64. document.getElementById("memorycell" + currentMemoryPos).classList.add("active_cell");
  65. break;
  66. case '+':
  67. memory[currentMemoryPos] = (memory[currentMemoryPos] + 1) % 256;
  68. document.getElementById("memorycell" + currentMemoryPos).innerHTML = memory[currentMemoryPos];
  69. break;
  70. case '-':
  71. memory[currentMemoryPos] = (memory[currentMemoryPos] + 255) % 256;
  72. document.getElementById("memorycell" + currentMemoryPos).innerHTML = memory[currentMemoryPos];
  73. break;
  74. case '.':
  75. var out = document.getElementById("output");
  76. out.innerHTML = out.innerHTML + String.fromCharCode(memory[currentMemoryPos]);
  77. break;
  78. case ',':
  79. break;
  80. case '[':
  81. if(memory[currentMemoryPos] === 0)
  82. {
  83. while(currentCodePos < code.length && code[currentCodePos] !== ']')
  84. {
  85. currentCodePos++;
  86. }
  87. }
  88. break;
  89. case ']':
  90. if(memory[currentMemoryPos] !== 0)
  91. {
  92. while(currentCodePos >= 0 && code[currentCodePos] !== '[')
  93. {
  94. currentCodePos--;
  95. }
  96. }
  97. break;
  98. }
  99. currentCodePos++;
  100. if(currentCodePos < code.length && !stopRunning)
  101. {
  102. setTimeout(execute, document.getElementById("delay").value);
  103. }
  104. else
  105. {
  106. running = false;
  107. stopRunning = false;
  108. document.getElementById("start").innerHTML = "Start";
  109. }
  110. }