-
Notifications
You must be signed in to change notification settings - Fork 0
/
script.js
85 lines (78 loc) · 2.61 KB
/
script.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
function run() {
document.getElementById("console").innerHTML = ""
let memorySize = document.getElementById("number").value
const memory = new Array(memorySize).fill(0)
//wskaźnik instrukcji
let ipointer = 0
//wskaźnik pamięci
let mpointer = 0
//stos lokalizacji początków pętli
let astack = []
let program = document.getElementById("code").value
let output = document.getElementById("console").value
interpret()
/* Interpreter */
function sendOutput(value) {
output += String.fromCharCode(value)
}
function getInput() {
let val = prompt("Wprowadź znak").charCodeAt(0)
return val
}
function interpret() {
let end = false
while (!end) {
switch (program[ipointer]) {
case '>':
if (mpointer == memory.length - 1)
memory.push(0, 0, 0, 0, 0)
mpointer++
break
case '<':
if (mpointer > 0)
mpointer--
break
case '+':
memory[mpointer]++
break
case '-':
memory[mpointer]--
break
case '.':
sendOutput(memory[mpointer])
break
case ',':
memory[mpointer] = getInput()
break
case '[':
if (memory[mpointer]) { // jeżeli nie jest 0
astack.push(ipointer)
} else { // Pomiń odpowiadające zakończenie pętli
let count = 0
while (true) {
ipointer++
if (!program[ipointer]) break
if (program[ipointer] === "[") count++
else if (program[ipointer] === "]") {
if (count) count--
else break
}
}
}
break
case ']':
//Wskaźnik automatycznie zwiększa się wraz z każdą iteracją, więc musimy zmniejszyć go by otrzymać właściwą wartość
ipointer = astack.pop() - 1
break
case undefined: //osiągnięto koniec programu
end = true
break
default: //traktowanie innych znaków jako komentarzy
break
}
ipointer++;
}
document.getElementById("console").innerHTML = output
return output
}
}