我的 Brainf*** 解释器不适用于通用的 Hello World 程序
My Brainf*** interpreter Does Not Work With Common Hellow World Program
我正在尝试用 C++ 制作一个 brainf*** 解释器。当我使用 Esolang hello world 示例对其进行测试时:
++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
在这里:https://esolangs.org/wiki/Brainfuck
无论出于何种原因,它都不打印任何内容。期间运算符有效,我单独测试过,但适用于正确的 brainf*** 解释器的程序不适用于我的。有人能在这里找到问题吗?
PS:
file_str::read(file);
是我实施的一种有效的自定义方法。只是想让你知道。
到目前为止,这是我的代码。
// Read File
std::string file_data;
file_data = file_str::read(file);
// Array
int array[30000];
bool running = true;
// pos
int pos = 0;
int pos_in_stack = 0;
// Handle brackets
std::vector<int> brackets;
// Main Loop
while(running)
{
if(pos > file_data.size()-1)
{
break;
}
// check what the curren command is and execute
if(file_data.at(pos) == '>')
{
pos_in_stack++;
pos++;
continue;
}
if(file_data.at(pos) == '<')
{
pos_in_stack--;
pos++;
continue;
}
if(file_data.at(pos) == '+')
{
array[pos_in_stack]++;
pos++;
continue;
}
if(file_data.at(pos) == '-')
{
array[pos_in_stack]--;
pos++;
continue;
}
if(file_data.at(pos) == '.')
{
char a = array[pos_in_stack];
std::cout << a;
pos++;
continue;
}
if(file_data.at(pos) == ',')
{
std::string a;
std::cin >> a;
char b = a.at(0);
array[pos_in_stack] = b;
pos++;
continue;
}
if(file_data.at(pos) == '[')
{
if(array[pos_in_stack] != 0)
{
brackets.push_back(pos);
pos++;
continue;
}
// find coresponding bracket
else{
int brackets_looking_for = 1;
while (brackets_looking_for != 0)
{
pos++;
if(file_data.at(pos) == '[')
{
brackets_looking_for++;
}
if(file_data.at(pos) == ']')
{
brackets_looking_for--;
}
}
continue;
}
}
if(file_data.at(pos) == ']')
{
if(array[pos_in_stack] != 0)
{
pos = brackets.at(brackets.size()-1);
continue;
}
brackets.pop_back();
pos++;
continue;
}
}
return 0;
}
感谢大家的帮助,但我找到了解决方案。
我需要改变这个:
pos = brackets.at(brackets.size()-1);
对此:
pos = brackets.at(brackets.size()-1)+1;
我正在尝试用 C++ 制作一个 brainf*** 解释器。当我使用 Esolang hello world 示例对其进行测试时:
++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
在这里:https://esolangs.org/wiki/Brainfuck
无论出于何种原因,它都不打印任何内容。期间运算符有效,我单独测试过,但适用于正确的 brainf*** 解释器的程序不适用于我的。有人能在这里找到问题吗?
PS:
file_str::read(file);
是我实施的一种有效的自定义方法。只是想让你知道。
到目前为止,这是我的代码。
// Read File
std::string file_data;
file_data = file_str::read(file);
// Array
int array[30000];
bool running = true;
// pos
int pos = 0;
int pos_in_stack = 0;
// Handle brackets
std::vector<int> brackets;
// Main Loop
while(running)
{
if(pos > file_data.size()-1)
{
break;
}
// check what the curren command is and execute
if(file_data.at(pos) == '>')
{
pos_in_stack++;
pos++;
continue;
}
if(file_data.at(pos) == '<')
{
pos_in_stack--;
pos++;
continue;
}
if(file_data.at(pos) == '+')
{
array[pos_in_stack]++;
pos++;
continue;
}
if(file_data.at(pos) == '-')
{
array[pos_in_stack]--;
pos++;
continue;
}
if(file_data.at(pos) == '.')
{
char a = array[pos_in_stack];
std::cout << a;
pos++;
continue;
}
if(file_data.at(pos) == ',')
{
std::string a;
std::cin >> a;
char b = a.at(0);
array[pos_in_stack] = b;
pos++;
continue;
}
if(file_data.at(pos) == '[')
{
if(array[pos_in_stack] != 0)
{
brackets.push_back(pos);
pos++;
continue;
}
// find coresponding bracket
else{
int brackets_looking_for = 1;
while (brackets_looking_for != 0)
{
pos++;
if(file_data.at(pos) == '[')
{
brackets_looking_for++;
}
if(file_data.at(pos) == ']')
{
brackets_looking_for--;
}
}
continue;
}
}
if(file_data.at(pos) == ']')
{
if(array[pos_in_stack] != 0)
{
pos = brackets.at(brackets.size()-1);
continue;
}
brackets.pop_back();
pos++;
continue;
}
}
return 0;
}
感谢大家的帮助,但我找到了解决方案。
我需要改变这个:
pos = brackets.at(brackets.size()-1);
对此:
pos = brackets.at(brackets.size()-1)+1;