Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Синтаксис языка:
- input -> m
- -кладет число из STDIN в ячейку памяти m.
- set x -> m
- -кладет число x в ячейку памяти m.
- assign m1 -> m2
- -кладет число из ячейки памяти m1 в ячейку памяти m2.
- print m
- -выводит в STDOUT число из ячейки памяти m.
- + x y -> m
- -складывает числа из ячеек памяти x и y, кладет результат в ячейку m.
- -аналогично "-"вычитание "*"умножение "%"взятие остатка от деления.
- abs m1 -> m2
- -считает модуль числа из ячейки m1, кладет значение в ячейку m2/
- equal x y -> m
- -проверяет на равенство числа из ячеек памяти x и y, кладет результат (boolean) в ячейку m.
- notEqual x y -> m
- --проверяет на неравенство числа из ячеек памяти x и y, кладет результат (boolean) в ячейку m.
- bigger x y -> m
- -проверяет на верность выражение "x > y", кладет результат (boolean) в ячейку m.
- if x
- [
- ...
- ]
- -условный оператор: если выражение в ячейке х истинно, выполняются операции внутри блока [],
- -после их выполнения контроль передается операциям после блока.
- -Если выражение ложно, блок операций пропускается.
- -В блоке может быть произвольное количество операций.
- {
- ...
- continue
- }
- -тело цикла
- -команда continue немедленно возвращает процесс к первой фигурной скобке.
- (после чего цикл начинается заново)
- -команда brake немедленно переводит процесс к последней фигурной скобке.
- (после чего цикл завершается)
- -если в теле цикла нет слова continue, тело цикла выполнится только один раз.
- Оступы в 4 пробела, стрелочки и переносы на новую строку необязательны,
- важны лишь пробелы между словами.
- Считается, что ячейки создаются "налету", при первом их использовании.
- Отрицательные адреса ячеек разрешены, но вирт. машина предупреждает о возможности ошибок
- в работе программы при их использовании.
- */
- let fileTitle = "GCD.txt";
- const fs = require('fs');
- let readline = require('readline-sync');
- let programText = fs.readFileSync(fileTitle, "utf8");
- var memory = (programText.replace(/(\r\n| |->)/g, " ")).split(" ");
- memory = DeleteEveryElement("", memory);
- memory.push("end");
- let ip = 0;
- var indexOffsetGlobal = memory.length;
- while (memory[ip] != "end") {
- switch (memory[ip]) {
- case "input":
- memory[$(ip + 1)] = parseFloat(readline.question("Enter value: "));
- ip += 2;
- break;
- case "print":
- console.log(memory[$(ip + 1)]);
- ip += 2;
- break;
- case "+":
- memory[$(ip + 3)] = memory[$(ip + 1)] + memory[$(ip + 2)];
- ip += 4;
- break;
- case "-":
- memory[$(ip + 3)] = memory[$(ip + 1)] - memory[$(ip + 2)];
- ip += 4;
- break;
- case "*" :
- memory[$(ip + 3)] = memory[$(ip + 1)] * memory[$(ip + 2)];
- ip += 4;
- break;
- case "%" :
- memory[$(ip + 3)] = memory[$(ip + 1)] % memory[$(ip + 2)];
- ip += 4;
- break;
- case "set":
- memory[$(ip + 2)] = parseInt(memory[ip + 1]);
- ip += 3;
- break;
- case "abs":
- memory[$(ip + 2)] = Math.abs(memory[$(ip + 1)]);
- ip += 3;
- break;
- case "assign":
- memory[$(ip + 2)] = memory[$(ip + 1)];
- ip += 3;
- break;
- case "continue":
- ip = FindPreviousSymbolIp(ip, "{");
- break;
- case "break":
- ip = FindNextSymbolIp(ip, "}");
- break;
- case "{":
- ip += 1;
- break;
- case "}":
- ip += 1;
- break;
- case "[":
- ip += 1;
- break;
- case "]":
- ip += 1;
- break;
- case "equal":
- memory[$(ip + 3)] = memory[$(ip + 1)] == memory[$(ip + 2)];
- ip += 4;
- break;
- case "notEqual":
- memory[$(ip + 3)] = memory[$(ip + 1)] != memory[$(ip + 2)];
- ip += 4;
- break;
- case "bigger":
- memory[$(ip + 3)] = memory[$(ip + 1)] > memory[$(ip + 2)];
- ip += 4;
- break;
- case "if":
- if (memory[$(ip + 1)]) ip += 2;
- else {
- ip = FindNextSymbolIp(ip, "]");
- }
- break;
- case "end":
- break;
- default:
- console.log("Error: Unknown command");
- break;
- }
- }
- function $(x) {
- let address = parseInt(memory[x]);
- if (address < 0) {
- console.log("Error: Negative address");
- }
- return address + indexOffsetGlobal;
- }
- function FindPreviousSymbolIp(actualIp, symbol) {
- let i = actualIp;
- while (memory[i] != symbol) {
- i -= 1;
- }
- return i;
- }
- function FindNextSymbolIp(actualIp, symbol) {
- let i = actualIp;
- while (memory[i] != symbol) {
- i += 1;
- }
- return i;
- }
- function DeleteEveryElement(target, array) {
- result = [];
- for (let i = 0; i < array.length; i++) {
- if (array[i] != target) result.push(array[i]);
- }
- return result;
- }
Advertisement
Add Comment
Please, Sign In to add comment