PageRenderTime 46ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/brainfuck.html

https://repo.or.cz/zzandy.git
HTML | 211 lines | 170 code | 41 blank | 0 comment | 0 complexity | 923389b4d299c7ac4f782d43f9e2bee2 MD5 | raw file
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
  4. <head>
  5. <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
  6. <link rel="stylesheet" href="style/pixelless.css" type="text/css"/>
  7. <script type="text/javascript" src="script/util.js"></script>
  8. <title>Brainfuck</title>
  9. </head>
  10. <body>
  11. <div id="container">
  12. <div class="content header">
  13. <h1>Brainfuck</h1>
  14. </div>
  15. <div class="content">
  16. <p><a href="http://en.wikipedia.org/wiki/Brainfuck">Brainfuck</a> "IDE"</p>
  17. <a href="#" onclick="run(); return false;" id="runit" style="text-decoration: none">&#x25B6; Run</a><br/>
  18. <pre>Clear: <a href="javascript:add(this)" onclick="add(this); return false;">[-]</a> Clear prev no zero: <a
  19. href="javascript:add(this)" onclick="add(this); return false;">[[-]&lt;]</a>
  20. Rewind: <a href="javascript:add(this)" onclick="add(this); return false;">[&lt;]&gt;</a> Fast-forward: <a
  21. href="javascript:add(this)" onclick="add(this); return false;">[&gt;]&lt;</a>
  22. Cat: <a href="javascript:add(this)" onclick="add(this); return false;">,[.,]</a> Moving the pointer: <a
  23. href="javascript:add(this)" onclick="add(this); return false;">&gt;,[.&gt;,]</a>
  24. Add: <a href="javascript:add(this)" onclick="add(this); return false;">[-&gt;+&lt;]</a> or <a
  25. href="javascript:add(this)" onclick="add(this); return false;">[-&gt;+&gt;+&lt;&lt;]&gt;&gt;[-&lt;&lt;+&gt;&gt;]</a> Copy: <a
  26. href="javascript:add(this)" onclick="add(this); return false;">[-]&gt;[-]&lt;&lt;[-&gt;+&gt;+&lt;&lt;]&gt;&gt;[-&lt;&lt;+&gt;&gt;]</a></pre>
  27. <div id="memory" style="float:right"></div>
  28. <div id="hint" style="clear: right; float:right">
  29. &gt; move right<br/>
  30. &lt; move left<br/>
  31. + increment data<br/>
  32. - decrement data<br/>
  33. . output<br/>
  34. , input<br/>
  35. [ if data is zero jump after matching ]<br/>
  36. ] id data is not zero goto matching [<br/>
  37. </div>
  38. <label>Input: <input type="text" id="input" value="" style="margin-bottom: .2em; font-family:monospace; width:80ex"/></label><br/>
  39. <textarea id="edit" cols="80" rows="14"></textarea>
  40. <textarea id="out" cols="80" rows="6" readonly="readonly"></textarea>
  41. </div>
  42. </div>
  43. <div id="footer">
  44. <div class="content">
  45. &copy; Copyright
  46. </div>
  47. </div>
  48. <script type="text/javascript" language="JavaScript">
  49. var memoryLimit = 30000;
  50. var execLimit = 10000;
  51. function add(obj)
  52. {
  53. var target = document.getElementById('edit');
  54. var x = target.selectionStart;
  55. var value = obj.innerHTML.replace(/&lt;/g, "<").replace(/&gt;/g, ">");
  56. var before = target.value.substring(0, x);
  57. var after = target.value.substr(target.selectionEnd);
  58. target.value = before + value + after;
  59. target.selectionStart = x + value.length;
  60. target.selectionEnd = x + value.length;
  61. target.focus();
  62. }
  63. function run()
  64. {
  65. function add(n)
  66. {
  67. var x = (memory[addr] || 0) + n;
  68. if (x > 255)x = 0;
  69. if (x < 0)x = 255;
  70. memory[addr] = x;
  71. return x;
  72. }
  73. function get_input()
  74. {
  75. var r = input[inpos++];
  76. if (r === undefined) return 0; // EOF
  77. return r.charCodeAt(0);
  78. }
  79. var inpos = 0;
  80. var input = document.getElementById('input').value;
  81. var src = document.getElementById('edit').value;
  82. var addr = 0;
  83. var memory = [];
  84. var out = '';
  85. var line = 1;
  86. var column = 0;
  87. var loops = [];
  88. var steps = 0;
  89. var loopstack = [];
  90. var i = -1, n = src.length;
  91. while (++i < n)
  92. {
  93. ++column;
  94. var op = src[i];
  95. switch (op) {
  96. case '[':
  97. loops[i] = 0;
  98. loopstack.push(i);
  99. break;
  100. case ']':
  101. var loop = loopstack.pop();
  102. if (loop === undefined)
  103. throw new Error(['Loop brace mismatch at line', line, ', column', column].join(' '));
  104. loops[loop] = i;
  105. break;
  106. case '\n':
  107. ++line;
  108. column = 1;
  109. break;
  110. }
  111. }
  112. delete loopstack;
  113. line = 1;
  114. column = 0;
  115. i = -1;
  116. n = src.length;
  117. while (++i < n)
  118. {
  119. if (++steps > execLimit)
  120. throw new Error(['Execution limit of ', execLimit, ' cycles exceded at line ', line, ', column', column].join(' '));
  121. ++column;
  122. var op = src[i];
  123. switch (op) {
  124. case '\n':
  125. ++line;
  126. column = 0;
  127. break;
  128. case '<':
  129. if (--addr < 0)
  130. throw new Error(['Address underrun at line', line, ', column', column].join(' '));
  131. break;
  132. case '>':
  133. if (++addr > memoryLimit)
  134. throw new Error(['Address overrun at line', line, ', column', column].join(' '));
  135. break;
  136. case '-':
  137. add(-1);
  138. break;
  139. case '+':
  140. add(1);
  141. break;
  142. case '[':
  143. if (!memory[addr])
  144. i = loops[i];
  145. break;
  146. case ']':
  147. i = loops.indexOf(i);
  148. if (i == -1)
  149. throw new Error(['Unxepected loop error at line', line, ', column', column].join(' '));
  150. --i;
  151. break;
  152. case '.':
  153. if (memory[addr] < 32)
  154. out += memory[addr].toString() + ' ';
  155. else
  156. out += String.fromCharCode(memory[addr]);
  157. break;
  158. case ',':
  159. memory[addr] = get_input();
  160. break;
  161. }
  162. }
  163. document.getElementById('memory').innerHTML = memory.map(function(x, n) {
  164. if (n == addr)return '<u>' + x + '</u>'; else return x;
  165. });
  166. document.getElementById('out').value = out;
  167. }
  168. </script>
  169. </body>
  170. </html>