7Bpencil

VirtualMachine

Dec 22nd, 2019
248
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2. Синтаксис языка:
  3.  
  4. input -> m
  5. -кладет число из STDIN в ячейку памяти m.
  6.  
  7. set x -> m
  8. -кладет число x в ячейку памяти m.
  9.  
  10. assign m1 -> m2
  11. -кладет число из ячейки памяти m1 в ячейку памяти m2.
  12.  
  13. print m
  14. -выводит в STDOUT число из ячейки памяти m.
  15.  
  16. + x y -> m
  17. -складывает числа из ячеек памяти x и y, кладет результат в ячейку m.
  18. -аналогично "-"вычитание "*"умножение "%"взятие остатка от деления.
  19.  
  20. abs m1 -> m2
  21. -считает модуль числа из ячейки m1, кладет значение в ячейку m2/
  22.  
  23. equal x y -> m
  24. -проверяет на равенство числа из ячеек памяти x и y, кладет результат (boolean) в ячейку m.
  25.  
  26. notEqual x y -> m
  27. --проверяет на неравенство числа из ячеек памяти x и y, кладет результат (boolean) в ячейку m.
  28.  
  29. bigger x y -> m
  30. -проверяет на верность выражение "x > y", кладет результат (boolean) в ячейку m.
  31.  
  32. if x
  33. [
  34.     ...
  35. ]
  36. -условный оператор: если выражение в ячейке х истинно, выполняются операции внутри блока [],
  37. -после их выполнения контроль передается операциям после блока.
  38. -Если выражение ложно, блок операций пропускается.
  39. -В блоке может быть произвольное количество операций.
  40.  
  41. {
  42.     ...
  43.     continue
  44. }
  45. -тело цикла
  46. -команда continue немедленно возвращает процесс к первой фигурной скобке.
  47. (после чего цикл начинается заново)
  48. -команда brake немедленно переводит процесс к последней фигурной скобке.
  49. (после чего цикл завершается)
  50. -если в теле цикла нет слова continue, тело цикла выполнится только один раз.
  51.  
  52.  
  53. Оступы в 4 пробела, стрелочки и переносы на новую строку необязательны,
  54. важны лишь пробелы между словами.
  55.  
  56.  
  57. Считается, что ячейки создаются "налету", при первом их использовании.
  58. Отрицательные адреса ячеек разрешены, но вирт. машина предупреждает о возможности ошибок
  59. в работе программы при их использовании.
  60. */
  61.  
  62.  
  63. let fileTitle = "GCD.txt";
  64.  
  65. const fs = require('fs');
  66. let readline = require('readline-sync');
  67. let programText = fs.readFileSync(fileTitle, "utf8");
  68. var memory = (programText.replace(/(\r\n|    |->)/g, " ")).split(" ");
  69. memory = DeleteEveryElement("", memory);
  70. memory.push("end");
  71.  
  72. let ip = 0;
  73. var indexOffsetGlobal = memory.length;
  74.  
  75. while (memory[ip] != "end") {
  76.     switch (memory[ip]) {
  77.         case "input":
  78.             memory[$(ip + 1)] = parseFloat(readline.question("Enter value: "));
  79.             ip += 2;
  80.             break;
  81.         case "print":
  82.             console.log(memory[$(ip + 1)]);
  83.             ip += 2;
  84.             break;
  85.         case "+":
  86.             memory[$(ip + 3)] = memory[$(ip + 1)] + memory[$(ip + 2)];
  87.             ip += 4;
  88.             break;
  89.         case "-":
  90.             memory[$(ip + 3)] = memory[$(ip + 1)] - memory[$(ip + 2)];
  91.             ip += 4;
  92.             break;
  93.         case "*" :
  94.             memory[$(ip + 3)] = memory[$(ip + 1)] * memory[$(ip + 2)];
  95.             ip += 4;
  96.             break;
  97.         case "%" :
  98.             memory[$(ip + 3)] = memory[$(ip + 1)] % memory[$(ip + 2)];
  99.             ip += 4;
  100.             break;
  101.         case "set":
  102.             memory[$(ip + 2)] = parseInt(memory[ip + 1]);
  103.             ip += 3;
  104.             break;
  105.         case "abs":
  106.             memory[$(ip + 2)] = Math.abs(memory[$(ip + 1)]);
  107.             ip += 3;
  108.             break;
  109.         case "assign":
  110.             memory[$(ip + 2)] = memory[$(ip + 1)];
  111.             ip += 3;
  112.             break;
  113.         case "continue":
  114.             ip = FindPreviousSymbolIp(ip, "{");
  115.             break;
  116.         case "break":
  117.             ip = FindNextSymbolIp(ip, "}");
  118.             break;
  119.         case "{":
  120.             ip += 1;
  121.             break;
  122.         case "}":
  123.             ip += 1;
  124.             break;
  125.         case "[":
  126.             ip += 1;
  127.             break;
  128.         case "]":
  129.             ip += 1;
  130.             break;
  131.         case "equal":
  132.             memory[$(ip + 3)] = memory[$(ip + 1)] == memory[$(ip + 2)];
  133.             ip += 4;
  134.             break;
  135.         case "notEqual":
  136.             memory[$(ip + 3)] = memory[$(ip + 1)] != memory[$(ip + 2)];
  137.             ip += 4;
  138.             break;
  139.         case "bigger":
  140.             memory[$(ip + 3)] = memory[$(ip + 1)] > memory[$(ip + 2)];
  141.             ip += 4;
  142.             break;
  143.         case "if":
  144.             if (memory[$(ip + 1)]) ip += 2;
  145.             else {
  146.                 ip = FindNextSymbolIp(ip, "]");
  147.             }
  148.             break;
  149.         case "end":
  150.             break;
  151.         default:
  152.             console.log("Error: Unknown command");
  153.             break;
  154.     }
  155. }
  156.  
  157. function $(x) {
  158.     let address = parseInt(memory[x]);
  159.     if (address < 0) {
  160.         console.log("Error: Negative address");
  161.     }
  162.     return address + indexOffsetGlobal;
  163. }
  164.  
  165. function FindPreviousSymbolIp(actualIp, symbol) {
  166.     let i = actualIp;
  167.     while (memory[i] != symbol) {
  168.         i -= 1;
  169.     }
  170.     return i;
  171. }
  172.  
  173. function FindNextSymbolIp(actualIp, symbol) {
  174.     let i = actualIp;
  175.     while (memory[i] != symbol) {
  176.         i += 1;
  177.     }
  178.     return i;
  179. }
  180.  
  181. function DeleteEveryElement(target, array) {
  182.     result = [];
  183.     for (let i = 0; i < array.length; i++) {
  184.         if (array[i] != target) result.push(array[i]);
  185.     }
  186.     return result;
  187. }
Advertisement
Add Comment
Please, Sign In to add comment