脑解释器在C++产生不正确的结果

Brainfuck interpreter in C++ produces incorrect result

本文关键字:不正确 结果 解释器 C++      更新时间:2023-10-16

我正在用C++编写一个 Brainfuck 解释器,但我无法让它正常工作。我是C++新手,但我知道 JavaScript,这就是为什么我使用我的 JavaScript 代码(完美运行)编写这个解释器作为参考。

#include <iostream>
#include <vector>
using namespace std;
void printVec(vector<int> arr) {
  for (int i = 0; i < arr.size(); i ++) {
    cout << arr[i] << ", " << endl;
  }
}
vector<int> brain(string code, string input = "") {
  vector<int> tape(1);
  vector<string> stack(0);
  int cur = 0;
  int mem = 0;
  for (int i = 0; i < code.length(); i ++) {
    switch (code[i]) {
      case '+':
        tape[cur]++;
        tape[cur] %= 256;
        break;
      case '-':
        tape[cur]--;
        if (tape[cur] < 0) tape[cur] = 256 - tape[cur] * -1;
        break;
      case '>':
        cur++;
        try {
          tape.at(cur);
        } catch (out_of_range& oor) {
          tape.push_back(0);
        }
        break;
      case '<':
        cur--;
        if (cur < 0) {
          cout << "Index too low!" << endl;
          throw 1;
        }
      case '[':
        mem = i;
        break;
      case ']':
        if (tape[cur] > 0) i = mem;
        break;
    }
  }
  return tape;
}
int main() {
  printVec(brain("+++[>++<-]"));
  return 0;
}

这将产生 0, 2 作为输出,而它应该是 0, 6。我认为问题出在我处理 Brainfuck 循环的方式(情况"["和"]"),但我无法弄清楚确切的问题。在 JavaScript 中,这些情况的代码看起来几乎完全相同,但它工作正常。

任何帮助将不胜感激,包括有关如何更好地编写此代码的其他部分的任何提示。

您的case '<':缺少break,因此也会失败并执行case '['的功能。 添加缺少的break;,看看这是否是您唯一的问题。

  case '<':
    cur--;
    if (cur < 0) {
      cout << "Index too low!" << endl;
      throw 1;
    }
    break;        // Add this
  case '[':
    mem = i;
    break;