Entry 966
Brainfuck (no errors manager)
Submitted by Raphaël Gaudy
on Aug. 26, 2008 at 11:01 p.m.
Language: C++. Code size: 2.3 KB.
#include <iostream> #include <fstream> #include <string> #include <vector> using namespace std; int main (int argc, char * const argv[]) { for (size_t i = 1; i < argc; i++) { //Ouverture des fichiers passés en arguments lors du lancement du programme ifstream fichier(argv[i], ios::in); if (fichier) { cout << "Démarrage de l'interpréteur pour \"" << argv[i] << "\"..." << endl; vector<char> tab(3000); char* elemTab = &tab.front(); unsigned int boucle; string code, ligne; while(getline(fichier, ligne)) code += ligne; for (size_t j = 0, L = code.length(); j < L; j++) { switch(code[j]) { case '>': //Avancement d'un octet if (elemTab == &tab.back()) elemTab = &tab.front(); //Si c'est le dernier élément, on revient au début else elemTab++; break; case '<': //Retour en arrière d'un octet if (elemTab == &tab.front()) elemTab = &tab.back(); //Si c'est le premier élément, on revient à la fin else elemTab--; break; case '+': ++*elemTab; //Incrémentation de l'octet pointé break; case '-': --*elemTab; //Décrementation " " " break; case '.': cout << *elemTab; //Affichage de l'octet pointé break; case ',': cin >> *elemTab; //Récupération du caractère dans la console et plaçage dans l'octet pointé break; case ']': boucle = 1; while (boucle) { j--; //On cherche en arriere if (code[j] == ']') boucle++; //Si on rencontre un ], alors on attend un [ de plus else if (code[j] == '[') boucle--; //Si on trouve un [. alors on en attend un de moins } j--; //On "jump" devant le [ correspondant. break; case'[': if (*elemTab == 0) { boucle = 1; // on doit monter $n ] en avant while (boucle) { j++; if (code[j] == '[') boucle++; // si on rencontre un [, alors on attend un ] de plus else if (code[j] == ']') boucle--; // si on trouve un ]. alors on en attend un de moins } // ici, on a pas de $i-- parce-qu'on jump apres le ] } break; default: break; } } fichier.close(); cout << endl << "Fin de l'interprétation" << endl; } else cerr << "Le fichier n'a pas pu être ouvert." << endl; } return 0; }
This snippet took 0.02 seconds to highlight.
Back to the Entry List or Home.