#include
#include
#include
class BrainfuckCompiler {
public:
BrainfuckCompiler(const std::string& bfCode) : brainfuckCode(bfCode) {}
void compile() {
std::cout << "#include \nint main() {\n";
std::cout << "char tape[30000] = {0};\nchar* data = tape;\n";
translateBrainfuck();
std::cout << "}\n";
}
private:
void translateBrainfuck() {
int dataPointer = 0;
std::stack loopStack;
for (char instruction : brainfuckCode) {
switch (instruction) {
case '>':
std::cout << "++data;\n";
break;
case '<':
std::cout << "--data;\n";
break;
case '+':
std::cout << "++(*data);\n";
break;
case '-':
std::cout << "--(*data);\n";
break;
case '.':
std::cout << "putchar(*data);\n";
break;
case ',':
std::cout << "*data = getchar();\n";
break;
case '[':
loopStack.push(loopCounter);
std::cout << "while (*data) {\n";
loopCounter++;
break;
case ']':
if (loopStack.empty()) {
// Error: unmatched ']'
handleCompilationError("Unmatched ']'");
return;
}
std::cout << "}\n";
loopStack.pop();
break;
default:
// Ignore characters other than Brainfuck instructions
break;
}
}
if (!loopStack.empty()) {
// Error: unmatched '['
handleCompilationError("Unmatched '['");
}
}
void handleCompilationError(const std::string& errorMessage) {
std::cerr << "Compilation Error: " << errorMessage << "\n";
}
std::string brainfuckCode;
int loopCounter = 0;
};