PDA

View Full Version : [C++] Interprete Brainfuck


Noixe
31-01-2011, 09:23
Ecco un interprete per il linguaggio Brainfuck:

#include <iostream>
#include <string>
#include <vector>
#include <fstream>

using namespace std;

vector<char> Istruzioni, Vettore;

int main (int argc, char* argv[]) {

ifstream input (argv[1], ios_base::in);
string str;
int indice = 0;

do {
getline(input, str, '\n');
for (int i = 0; i < str.size(); i++)
Istruzioni.push_back(str[i]);
}
while (!input.eof());

input.close();

Vettore.resize(Istruzioni.size());

for (int i = 0; i < Istruzioni.size(); i++) {

switch (Istruzioni[i]) {

case '>' :
if (indice < Vettore.size() - 1)
indice++;
break;

case '<' :
if (indice > 0)
indice--;
break;

case '+' :
Vettore[indice]++;
break;

case '-' :
if (Vettore[indice] > 0)
Vettore[indice]--;
break;

case '.' :
putchar(Vettore[indice]);
break;

case ',' :
Vettore[indice] = getchar();
break;

case '[' :
if (!Vettore[indice]) {
int quadre = 0;
while (i < Istruzioni.size()) {
if (Istruzioni[i] == '[')
quadre++;
else
if (Istruzioni[i] == ']')
quadre--;
i++;

if (quadre == 0) {
i--;
break;
};
};
};
break;

case ']' :
if (Vettore[indice]) {
int quadre = 0;
while (i >= 0) {
if (Istruzioni[i] == '[')
quadre++;
else
if (Istruzioni[i] == ']')
quadre--;
i--;

if (quadre == 0) {
i++;
break;
};
};
};
break;
};
};

return 0;
}

In questo sito ci sono dei sorgenti da provare: http://esoteric.sange.fi/brainfuck/bf-source/prog

Mi è piacuto molto questo: http://esoteric.sange.fi/brainfuck/bf-source/prog/mandelbrot.b

Saluti