Interprete Brainfuck

Stato
Discussione chiusa ad ulteriori risposte.

Noixe

Utente Silver
27 Dicembre 2008
0
0
0
55
Ecco un interprete per il linguaggio Brainfuck:

Codice:
#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
 
Sarebbe piu` utile se, invece che un programma vero e proprio (tutto nel main) fosse una classe per la gestione del linguaggio in genere, con poi rilasciato insieme un client con implementato l'interprete vero e proprio, dove metti una gestione degli argomenti (un pazzo di usage per intenderci). Also evita gli oggetti globali, potrebbe assalirti un velociraptor.

Gut anyways
 
tilde ha detto:
Sarebbe piu` utile se, invece che un programma vero e proprio (tutto nel main) fosse una classe per la gestione del linguaggio in genere,

Si tratta più che altro di un esercizio.

tilde ha detto:
con poi rilasciato insieme un client con implementato l'interprete vero e proprio, dove metti una gestione degli argomenti (un pazzo di usage per intenderci). Also evita gli oggetti globali, potrebbe assalirti un velociraptor.

Potrei anche a fornire una versione interattiva (con interpretazione del codice passato a riga di comando) ma mi è sembrato sufficiente e molto più utile (per un linguaggio che è abbastanza inutile) la lettura da file.

Chi avesse voglia di seguire i tuoi consigli può partire dal mio codice come base.
 
Non vedo perche` non scrivere software riusabile o semplicemente ben strutturato anche quando si svolgono esercizi :) e` buona abitudine
 
tilde ha detto:
Non vedo perche` non scrivere software riusabile o semplicemente ben strutturato anche quando si svolgono esercizi :) e` buona abitudine

Si si, ma sul momento mi interessava solo che l'idea che avevo funzionasse.
Se ho tempo organizzo meglio il codice.
 
Stato
Discussione chiusa ad ulteriori risposte.