begin process at 2012 05 27 14:44:07
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Application

 > COMPILATEUR BF VERS BF-BYTECODE

COMPILATEUR BF VERS BF-BYTECODE


 Information sur la source

Note :
Aucune note
Catégorie :Application Classé sous :Compilateur, Brainfuck, bytecode, CPP Niveau :Initié Date de création :06/03/2010 Date de mise à jour :06/03/2010 15:16:22 Vu :1 249

Auteur : Davy974

Ecrire un message privé
Commentaire sur cette source (2)
Ajouter un commentaire et/ou une note

 Description

Ce petit programme est un [dé]compilateur (avec préprocesseur inclus) capable de compiler un code source natif Bf en une sorte de bytecode puis de restaurer le code source à partir de celui-ci.

C'est la version 1.1 que je poste (la version 1.0 marchait très très ... très mal)

Source

  • #include <iostream>
  • #include <fstream>
  • #include <string>
  • using namespace std;
  • void preprocess(fstream&, fstream&);
  • void compile(fstream&, fstream&);
  • void decompile(fstream&, fstream&);
  • int translate(char);
  • char untranslate(int);
  • int main(int argn, char** argv)
  • {
  • if (argn != 4)
  • {
  • cout << "bar <input> <option> <output>" << endl;
  • return 1;
  • }
  • fstream in(argv[1], ios::in);
  • if (!in)
  • {
  • cout << argv[1] << ": no such file or directory" << endl;
  • return 2;
  • }
  • fstream out(argv[3], (ios::out | ios::trunc));
  • if (string(argv[2]) == "-c")
  • {
  • string tmpfile = (string(argv[1]) + ".bfp");
  • fstream tmp(tmpfile.c_str(), ios::out | ios::trunc);
  • preprocess(in, tmp);
  • tmp.close();
  • tmp.open(tmpfile.c_str(), ios::in);
  • compile(tmp, out);
  • tmp.close();
  • remove(tmpfile.c_str());
  • }
  • if (string(argv[2]) == "-d")
  • decompile(in, out);
  • if (string(argv[2]) == "-e")
  • preprocess(in, out);
  • in.close();
  • out.close();
  • }
  • int translate(char c)
  • {
  • switch (c)
  • {
  • case '\0': return 0;
  • case '>': return 1;
  • case '<': return 2;
  • case '+': return 3;
  • case '-': return 4;
  • case '{': return 5;
  • case '}': return 6;
  • case '.': return 7;
  • case '?': return 8;
  • }
  • return 0;
  • }
  • char untranslate(int i)
  • {
  • switch (i)
  • {
  • case 1: return '>';
  • case 2: return '<';
  • case 3: return '+';
  • case 4: return '-';
  • case 5: return '{';
  • case 6: return '}';
  • case 7: return '.';
  • case 8: return '?';
  • default: return '\0';
  • }
  • }
  • void preprocess(fstream& in, fstream& out)
  • {
  • string buffer = "";
  • char c = 0;
  • while (in >> c)
  • {
  • if (c == '#')
  • getline(in, buffer);
  • if ((c == '>') or (c == '<') or (c == '+') or (c == '-')
  • or (c == '{') or (c == '}') or (c == '?') or (c == '.'))
  • out << c;
  • if (c == ',')
  • out << '?';
  • if (c == '[')
  • out << '{';
  • if (c == ']')
  • out << '}';
  • }
  • }
  • void compile(fstream& in, fstream& out)
  • {
  • uchar c = 0;
  • uchar c2 = 0;
  • int i = 0;
  • while (in >> c >> c2)
  • {
  • out << (char)((16 * translate(c)) + translate(c2));
  • i++;
  • }
  • if ((i % 2) == 0)
  • {
  • in >> c;
  • out << (char)((16 * translate(c)) + 0);
  • }
  • }
  • void decompile(fstream& in, fstream& out)
  • {
  • int i = 0;
  • int j = 0;
  • char c = 0;
  • while (in >> c)
  • {
  • i = (((uchar)c) / 16);
  • j = (((uchar)c) % 16);
  • out << untranslate(i) << untranslate(j);
  • }
  • }
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

void preprocess(fstream&, fstream&);
void compile(fstream&, fstream&);
void decompile(fstream&, fstream&);

int translate(char);
char untranslate(int);

int main(int argn, char** argv)
{
    if (argn != 4)
    {
        cout << "bar <input> <option> <output>" << endl;

        return 1;
    }

    fstream in(argv[1], ios::in);

    if (!in)
    {
        cout << argv[1] << ": no such file or directory" << endl;

        return 2;
    }

    fstream out(argv[3], (ios::out | ios::trunc));

    if (string(argv[2]) == "-c")
    {
        string tmpfile = (string(argv[1]) + ".bfp");

        fstream tmp(tmpfile.c_str(), ios::out | ios::trunc);

        preprocess(in, tmp);

        tmp.close();

        tmp.open(tmpfile.c_str(), ios::in);

        compile(tmp, out);

        tmp.close();

        remove(tmpfile.c_str());
    }

    if (string(argv[2]) == "-d")
        decompile(in, out);
    if (string(argv[2]) == "-e")
        preprocess(in, out);

    in.close();
    out.close();
}

int translate(char c)
{
    switch (c)
    {
        case '\0': return 0;
        case '>': return 1;
        case '<': return 2;
        case '+': return 3;
        case '-': return 4;
        case '{': return 5;
        case '}': return 6;
        case '.': return 7;
        case '?': return 8;
    }

    return 0;
}

char untranslate(int i)
{
    switch (i)
    {
        case 1: return '>';
        case 2: return '<';
        case 3: return '+';
        case 4: return '-';
        case 5: return '{';
        case 6: return '}';
        case 7: return '.';
        case 8: return '?';

        default: return '\0';
    }
}

void preprocess(fstream& in, fstream& out)
{
    string buffer = "";
    char c = 0;

    while (in >> c)
    {
        if (c == '#')
            getline(in, buffer);

        if ((c == '>') or (c == '<') or (c == '+') or (c == '-')
        or (c == '{') or (c == '}') or (c == '?') or (c == '.'))
            out << c;

        if (c == ',')
            out << '?';
        if (c == '[')
            out << '{';
        if (c == ']')
            out << '}';
    }
}

void compile(fstream& in, fstream& out)
{
    uchar c = 0;
    uchar c2 = 0;

    int i = 0;

    while (in >> c >> c2)
    {
        out << (char)((16 * translate(c)) + translate(c2));
        i++;
    }

    if ((i % 2) == 0)
    {
        in >> c;

        out << (char)((16 * translate(c)) + 0);
    }
}

void decompile(fstream& in, fstream& out)
{
    int i = 0;
    int j = 0;

    char c = 0;

    while (in >> c)
    {
        i = (((uchar)c) / 16);
        j = (((uchar)c) % 16);

        out << untranslate(i) << untranslate(j);
    }
}

 Conclusion

Ce petit programme permet de compiler vos codes BF de manière sure et de les décompiler si besoin (source effacée par erreur, ou toute autre cause)


 Historique

06 mars 2010 15:16:22 :
Coorection d'une faute de lexing !

 Sources du même auteur

RETOURNER PLUSIEURS ARGUMENTS AVEC LES TUPLES

 Sources de la même categorie

Source avec Zip Source avec une capture PROGRAMME DE SUDOKU par AffreuxJojp
Source avec Zip EVALUATEUR D'EXPRESSION ARITHMÉTIQUE par matrx180vTitanium
Source avec Zip Source avec une capture QBIBLIO GESTION DES PRÊTS par conatic
Source avec Zip Source avec une capture QL-CHATROOM V 1.0 par mature
Source avec Zip Source avec une capture GEOLOCALISATION par ganjarasta

 Sources en rapport avec celle ci

Source avec une capture [C++] & SFML CRYPTOGRAPHIE par pop70
Source avec Zip GÉNÉRE UN TABLEAU DE CARACTÉRE AU FORMAT C CONTENANT LE BYTE... par kertimanoff
Source avec Zip Source avec une capture JEU DU CONTRE LA MONTRE par verbatron
Source avec Zip Source avec une capture COMPILATEUR DE PSEUDO PASCAL par CptPingu
Source avec une capture CALCUL DE L'ENVELOPPE CONVEXE D'UN NUAGE DE POINTS DANS UN P... par Lucky92

Commentaires et avis

Commentaire de BruNews le 06/03/2010 19:01:28 administrateur CS

C'est quoi un 'code BF' ???

Commentaire de Davy974 le 07/03/2010 08:46:00

C'est du Brainfuck (faut bien le dire, non ?), tape wiki BF sur google,si tu veux voir

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

réponse compilateur dev-cpp [ par surfeurnet ] Dev-cpp m'envoit 20 mesages d'erreur du type :[Linker error] undefined reference to `WSAStartup@8'Quelqu'un pourrait-il m'indiquer ce que cela signif Développement d'un compilateur C vers ByteCode pour machine virtuelle [ par xterminhate ] Bonjour ! Je souhaiterais développer un simple compilateur C pour une machine virtuelle. Existe-t-il des "briques logicielles" de base pour constru [OLE] Génération des msword.cpp et msword.h [ par cstriker ] Bonjour, Je dois améliorer un programme pour qu'il crée (ou modifie un template) un document word. J'ai donc suivi le tutorial donné par microsoft. Erreur de compilation Helloworld sous eclipse galileo [ par dams13120 ] Bonjour, Je connais un peu le C++. Je voulais utiliser l'IDE Eclipse dans le but de cross-compiler un projet sur une board. Seulement en essayant seul Créer un compilateur C avec C [ par agsudoku ] Bonjour Je suis appelée à créer un compilateur C dans le cadre d'un projet. je connais le principe(analyse lexicale, ensuite syntaxique, analyse sé [cpp] cherche conseil pour choix d'une base de données [ par Daemonight ] Bonjour tout le monde, ca fait un petit moment que je fais du c/cpp, et ce matin, j'ai fait un peu le bilan de ce que je savais faire. De ce bilan est Lecture de 2 samples simultanés avec FMOD [ par kouax ] Bonjour, J'utilise actuellement FMOD, et j'ai un soucis pour lire un sample tout en ayant un autre fond sonore qui tourne en boucle. Je joue donc le " Compiler un code c par dev_cpp [ par mechwalid ] Bonjour [^^youpi]: , j ai essayé de compiler ce petit code : #include #include int main (void) { printf("Hello world!\n"); system("pause"); Pyramide Chiffre [ par egs1989 ] Bonjour à tous, J'ai fait un bout d'un prog pour la fameuse pyramide de chiffres mais je reste bloqué car le programme continu de compter après 10 et


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,635 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales