-
Notifications
You must be signed in to change notification settings - Fork 0
/
bf.cpp
93 lines (88 loc) · 2.58 KB
/
bf.cpp
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
86
87
88
89
90
91
92
93
/* Language: C++
* Run like
* g++ -o bf bf.cpp
* ./bf
*/
#include <iostream>
#include <string>
#include <array>
#include <fstream>
using u32 = unsigned int;
using byte = unsigned char;
const u32 TAPE_LEN = 3e4;
void interpret(const std::string& code) {
std::array<byte, TAPE_LEN> tape;
tape.fill(0);
u32 pdata = 0;
u32 pinst = 0;
while (pinst < code.length()) {
switch (code[pinst]) {
case '>':
if (pdata < TAPE_LEN - 1) pdata++;
break;
case '<':
if (pdata > 0) pdata--;
break;
case '+':
if (tape[pdata] < 255)
tape[pdata] = tape[pdata] + 1;
break;
case '-':
if (tape[pdata] > 0)
tape[pdata] = tape[pdata] - 1;
break;
case '.':
std::cout << tape[pdata];
break;
case ',':
std::cout << "Input>";
std::cin >> tape[pdata];
break;
case '[':
if (tape[pdata] == 0) {
u32 bracket_stack = 0;
while (pinst < code.length()) {
pinst++;
if (code[pinst] == '[')
bracket_stack++;
else if (code[pinst] == ']' && bracket_stack > 0)
bracket_stack--;
else if (code[pinst] == ']' && bracket_stack == 0) {
pinst++;
break;
}
}
}
break;
case ']':
if (tape[pdata] != 0) {
u32 bracket_stack = 0;
while (pinst > 0) {
pinst--;
if (code[pinst] == ']')
bracket_stack++;
else if (code[pinst] == '[' && bracket_stack > 0)
bracket_stack--;
else if (code[pinst] == '[' && bracket_stack == 0)
break;
}
}
break;
}
pinst++;
}
std::cout << std::endl;
}
int main(int argc, char** argv) {
if (argc > 1)
interpret(argv[1]);
else {
while (true) {
putchar('>');
std::string input;
std::getline(std::cin, input);
interpret(std::move(input));
}
}
return 0;
}