Advertisement
Guest User

Untitled

a guest
Jul 5th, 2015
218
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.49 KB | None | 0 0
  1. declare function require(module:string):any;
  2. declare var process:any;
  3.  
  4. var readline = require('readline');
  5. var fs = require('fs');
  6.  
  7. type brainfuckDone = (char : string) => void;
  8. type brainfuckInput = (done : brainfuckDone) => void;
  9.  
  10. function brainfuck(tokens : string[], inp : brainfuckInput) {
  11. var heap = [0];
  12. var pointer = 0;
  13. var idx = 0;
  14.  
  15. function movePointer(diff : number) {
  16. pointer += diff;
  17.  
  18. if (typeof heap[pointer] === 'undefined') {
  19. heap[pointer] = 0;
  20. }
  21. }
  22.  
  23. function forwardTo(char : string, recurseString : string) {
  24. let count = 0;
  25. for (idx = idx + 1; idx < tokens.length; idx++) {
  26. let token = tokens[idx];
  27.  
  28. if (token === recurseString) {
  29. count++;
  30. } else if (token === char) {
  31. if (count === 0) {
  32. break;
  33. } else {
  34. count--;
  35. }
  36. }
  37. }
  38. }
  39.  
  40. function backTo(char : string, recurseString : string) {
  41. let count = 0;
  42. for (idx = idx - 1; idx > 0; idx--) {
  43. let token = tokens[idx];
  44.  
  45. if (token === recurseString) {
  46. count++;
  47. } else if (token === char) {
  48. if (count === 0) {
  49. break;
  50. } else {
  51. count--;
  52. }
  53. }
  54. }
  55. }
  56.  
  57. function next() {
  58. if (idx < tokens.length) {
  59. idx++;
  60. handleToken();
  61. }
  62. }
  63.  
  64. function handleToken() {
  65. let token = tokens[idx];
  66. let shouldNext = true;
  67.  
  68. switch (token) {
  69. case '+':
  70. heap[pointer]++;
  71. break;
  72.  
  73. case '-':
  74. heap[pointer]--;
  75. break;
  76.  
  77. case '>':
  78. movePointer(1);
  79. break;
  80.  
  81. case '<':
  82. movePointer(-1);
  83. break;
  84.  
  85. case '[':
  86. if (heap[pointer] === 0) {
  87. forwardTo(']', '[');
  88. }
  89. break;
  90.  
  91. case ']':
  92. if (heap[pointer] !== 0) {
  93. backTo('[', ']');
  94. }
  95. break;
  96.  
  97. case '.':
  98. fs.writeSync(process.stdout.fd, String.fromCharCode(heap[pointer]));
  99. break;
  100.  
  101. case ',':
  102. inp(str => {
  103. heap[pointer] = str.charCodeAt(0);
  104. next();
  105. });
  106.  
  107. shouldNext = false;
  108. break;
  109. }
  110.  
  111. if (shouldNext) {
  112. next();
  113. }
  114. }
  115.  
  116. handleToken();
  117. }
  118.  
  119. brainfuck(`
  120. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.
  121. +++++++++++++++++++++++++++++.
  122. +++++++.
  123. .
  124. +++.
  125. -------------------------------------------------------------------.
  126. ------------.
  127. +++++++++++++++++++++++++++++++++++++++++++++++++++++++.
  128. ++++++++++++++++++++++++.
  129. +++.
  130. ------.
  131. --------.
  132. -------------------------------------------------------------------.
  133. `.split(''), (done : brainfuckDone) => {
  134. var rl = readline.createInterface({
  135. input: process.stdin,
  136. output: process.stdout
  137. });
  138.  
  139. rl.question("Input [Only One Char] ", function(answer) {
  140. rl.close();
  141.  
  142. done(answer[0]);
  143. });
  144. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement