Compilateur bf vers bf-bytecode

Soyez le premier à donner votre avis sur cette source.

Snippet vu 2 526 fois - Téléchargée 18 fois

Contenu du snippet

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 / Exemple :


#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)

A voir également

Ajouter un commentaire

Commentaires

Messages postés
9
Date d'inscription
mercredi 14 octobre 2009
Statut
Membre
Dernière intervention
7 mars 2010

C'est du Brainfuck (faut bien le dire, non ?), tape wiki BF sur google,si tu veux voir
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
C'est quoi un 'code BF' ???

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.