C ++中的Brainfuck解释器产生不正确的结果

时间:2017-11-09 06:20:56

标签: c++ for-loop interpreter brainfuck

我正在用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循环的方式(案例&#39; [&#39;和&#39;]& #39;)但我无法弄清楚确切的问题。在JavaScript中,这些案例的代码看起来几乎完全相同,但它工作正常。

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

1 个答案:

答案 0 :(得分:1)

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

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