brainfuck.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  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. var length = document.getElementById("input").value.length;
  44. if(currentCodePos >= length && length !== 0)
  45. {
  46. reset();
  47. }
  48. document.getElementById("start").innerHTML = "Halt";
  49. running = true;
  50. setTimeout(execute, 200);
  51. }
  52. function execute()
  53. {
  54. var code = document.getElementById("input").value;
  55. var output = code.substring(0, currentCodePos) + "<span class='active_code'>" +
  56. code.substring(currentCodePos, currentCodePos + 1) + "</span>" + code.substring(currentCodePos + 1, code.length);
  57. output = output.replace(new RegExp("\n", 'g'), "<br>");
  58. document.getElementById("outputcode").innerHTML = output;
  59. switch(code[currentCodePos])
  60. {
  61. case '>':
  62. document.getElementById("memorycell" + currentMemoryPos).classList.remove("active_cell");
  63. currentMemoryPos = (currentMemoryPos + 1) % memoryCells;
  64. document.getElementById("memorycell" + currentMemoryPos).classList.add("active_cell");
  65. break;
  66. case '<':
  67. document.getElementById("memorycell" + currentMemoryPos).classList.remove("active_cell");
  68. currentMemoryPos = (currentMemoryPos + memoryCells - 1) % memoryCells;
  69. document.getElementById("memorycell" + currentMemoryPos).classList.add("active_cell");
  70. break;
  71. case '+':
  72. memory[currentMemoryPos] = (memory[currentMemoryPos] + 1) % 256;
  73. document.getElementById("memorycell" + currentMemoryPos).innerHTML = memory[currentMemoryPos];
  74. break;
  75. case '-':
  76. memory[currentMemoryPos] = (memory[currentMemoryPos] + 255) % 256;
  77. document.getElementById("memorycell" + currentMemoryPos).innerHTML = memory[currentMemoryPos];
  78. break;
  79. case '.':
  80. var out = document.getElementById("output");
  81. out.innerHTML = out.innerHTML + String.fromCharCode(memory[currentMemoryPos]);
  82. break;
  83. case ',':
  84. break;
  85. case '[':
  86. if(memory[currentMemoryPos] === 0)
  87. {
  88. while(currentCodePos < code.length && code[currentCodePos] !== ']')
  89. {
  90. currentCodePos++;
  91. }
  92. }
  93. break;
  94. case ']':
  95. if(memory[currentMemoryPos] !== 0)
  96. {
  97. while(currentCodePos >= 0 && code[currentCodePos] !== '[')
  98. {
  99. currentCodePos--;
  100. }
  101. }
  102. break;
  103. }
  104. currentCodePos++;
  105. if(currentCodePos < code.length && !stopRunning)
  106. {
  107. setTimeout(execute, document.getElementById("delay").value);
  108. }
  109. else
  110. {
  111. running = false;
  112. stopRunning = false;
  113. document.getElementById("start").innerHTML = "Start";
  114. }
  115. }