Interpréter les boucles de brainfuck

a marqué ce sujet comme résolu.

Bonjour,

Je me suis mis au défi de créer un interpréteur brainfuck en C++. Pour le moment, voici à quoi ressemble ma méthode qui me permet d’interpréter le code :

void interpret(std::string const &instructions, mem const &memory, mem::iterator &iter)
{
    for(char const c : instructions) {
        if (is_instruction(c)) {
            switch (c) {
            case '<':
                iter--;
                if (iter < memory.begin()) throw std::runtime_error{"Memory overflow."};
                break;
            case '>':
                iter++;
                if (iter >= memory.end()) throw std::runtime_error{"Memory overflow."};
                break;
            case '+':
                if ((*iter) - 1 > 255) *iter = 0;
                else (*iter)++;
                break;
            case '-':
                if ((*iter) - 1 < 0) *iter = 255;
                else (*iter)--;
                break;
            case '.':
                std::cout << *iter;
                break;
            case ',':
                *iter = static_cast<unsigned char>(getchar());
                break;
            case '[':
                // TODO
                break;
            case ']':
                // TODO
                break;
            default:
                break;
            }
        }
    }
}

Seulement je ne vois absolument pas comment gérer les boucles. Auriez-vous des conseils à me donner ?

Merci à vous ! :)

+0 -0

Tu ne peux pas faire for (char const c : instructions), il faut une variable qui te dit où tu es dans le programme (on appelle ça un "program counter", pc pour les intimes), pour pouvoir sauter d’une instruction à une autre qui n’est pas l’instruction suivante:

ptrdiff_t pc = 0;
size_t limit = instructions.length();
while (pc < limit) {
  const char c = instructions[pc++];
  ...
}

dans le corps de la boucle, pc vaut déjà la valeur suivante, mais il faut le réinitialiser dans certains cas de sauts (] ou [ quand l’indice est ou n’est pas 0).

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte