BF compiler in C Programming Language

BF Compiler in C Program


# include <stdio.h>
# include <stdlib.h>

    //Programkód megadása a programban
    char programkod[] = "[][[]][]";

    //Függvények deklarálása
    int helyes_e_nyito(int x, int y);
    int helyes_e_csuko(int x, int y);
    int nullaz(int x);
    int osszevon_jobbra(int x);
    int osszevon_balra(int x);
    int osszevon_plusz(int x);
    int osszevon_minusz(int x);
    int kovetkezo_elem(int x);
    void bahuzas(int x);

int main(void){

    //Kezdeti dolgok b programban
    printf("# include <stdio.h>\n");
    printf("# include <stdlib.h>\n\n");
    printf("int main(void){\n\n");

    //Szalag és hely definiálása b programban
    printf("\tunsigned char szalag[32768];\n");
    printf("\tint hol = 0;\n");
    printf("\tint i = 0;\n");

    //Szalag inicializálása
    int cimke = 0;
    printf("\n\tcimke%d :\n", cimke);
    printf("\tif(i < 32768){\n");
    printf("\t\tszalag[i] = 0;\n");
    printf("\t\ti++;\n");
    printf("\t\tgoto cimke%d;\n", cimke);
    printf("\t}\n\n");
    cimke++;

    //BF értelmezéshez szükséges változók bevezetése a programban
    int nemkomment, i, ciklus, ciklusban, n;
    nemkomment = i = ciklus = ciklusban = n = 0;

    //BF kód vizsgálata (hossz, komment/nem komment) a programban
    while(programkod[i] != 0 && nemkomment < 32768){
        if(programkod[i] == '>' || programkod[i] == '<' || programkod[i] == '+' || programkod[i] == '-' || programkod[i] == '.' || programkod[i] == ',' || programkod[i] == '[' || programkod[i] == ']'){
            nemkomment++;
            //BF kód értelmezése (nem komment) a programban
            switch(programkod[i]){
                case '>' :  behuzas(ciklusban);
                            printf("\thol += %d;\n", osszevon_jobbra(i));
                            i += kovetkezo_elem(i);
                            break;
                case '<' :  behuzas(ciklusban);
                            printf("\thol -= %d;\n", osszevon_balra(i));
                            i += kovetkezo_elem(i);
                            break;
                case '+' :  behuzas(ciklusban);
                            printf("\tszalag[hol] += %d;\n", osszevon_plusz(i));
                            i += kovetkezo_elem(i);
                            break;
                case '-' :  behuzas(ciklusban);
                            printf("\tszalag[hol] -= %d;\n", osszevon_minusz(i));
                            i += kovetkezo_elem(i);
                            break;
                case '.' :  behuzas(ciklusban);
                            printf("\tprintf(\"%%c\"), szalag[hol];\n");
                            break;
                case ',' :  behuzas(ciklusban);
                            printf("\tscanf(\"%%c\"), &szalag[hol];\n");
                            break;
                case '[' :  //'[' szintaktikai hiba keresése a programban
                            if(helyes_e_nyito(i, ciklus)){
                                //Nullázó ciklus detektálása
                                if (nullaz(i)){
                                    printf("\tszalag[hol] = 0;\n");
                                    i += 2;
                                }else{
                                    printf("\n");
                                    behuzas(ciklusban);
                                    n = cimke;
                                    printf("\tcimke%d :\n", n);
                                    behuzas(ciklusban);
                                    printf("\tif(szalag[hol] != 0){\n\n");
                                    ciklusban++;
                                    cimke++;
                                }
                            }else{
                                printf("\nHibas programkod!\n");
                                return 9;
                            }
                            break;
                case ']' :  //']' szintaktikai hiba keresése a programban
                            printf("\n");
                            ciklusban--;
                            if(helyes_e_csuko(i, ciklus)){
                                behuzas(ciklusban);
                                printf("\tgoto cimke%d;\n", n);
                                behuzas(ciklusban);
                                printf("\t}\n\n", n);
                                n--;
                            }else{
                                printf("\nHibas programkod!\n");
                                return 9;
                            }
                            break;
            }
        }else{
            //BF komment karakterek kiírása b programban
            printf("\tprintf(\"%c\");\n", programkod[i]);
        }
        i++;
    }

    //Vég dolgok b programban
    printf("\nreturn 0;\n");

    return 0;
}

//Függvények a programhoz
//Megnézi, hogy '[' szempontjából szintakitkai hibás-e a program
int helyes_e_nyito(int x, int y){
    int aktualis = y;
    y++;
    while(y != aktualis){
        x++;
        switch(programkod[x]){
            case '[' : y++;
            break;
            case ']' : y--;
            break;
            case 0 : return 0;
            break;
        }
    }
    return 1;
}

//Megnézi, hogy ']' szempontjából szintaktikai hibás-e a program
int helyes_e_csuko(int x, int y){
    int aktualis = y;
    y--;
    while(y != aktualis){
        x--;
        switch(programkod[x]){
            case '[' : y++;
            break;
            case ']' : y--;
            break;
            case 0 : return 0;
            break;
        }
    }
    return 1;
}

//Megnézi nullázó ciklus-e
int nullaz(int x){
    x++;
    if(programkod[x] == '-'){
        x++;
        if(programkod[x] == ']'){
            return 1;
        }
    }
    return 0;
}

//Ha lehetséges összevon '>'-kat (esetleg '<'-okat)
int osszevon_jobbra(int x){
    int y = 1;
    while(programkod[x] == '>' || programkod[x] == '<'){
        x++;
        switch(programkod[x]){
            case '>' : y++;
            break;
            case '<' : y--;
            break;
        }
    }
    return y;
}

//Ha lehetséges összevon '<'-kat (esetleg '>'-okat)
int osszevon_balra(int x){
    int y = 1;
    while(programkod[x] == '>' || programkod[x] == '<'){
        x++;
        switch(programkod[x]){
            case '<' : y++;
            break;
            case '>' : y--;
            break;
        }
    }
    return y;
}

//Ha lehetséges összevon '+'-kat (esetleg '-'-okat)
int osszevon_plusz(int x){
    int y = 1;
    while(programkod[x] == '+' || programkod[x] == '-'){
        x++;
        switch(programkod[x]){
            case '+' : y++;
            break;
            case '-' : y--;
            break;
        }
    }
    return y;
}

//Ha lehetséges összevon '-'-kat (esetleg '+'-okat)
int osszevon_minusz(int x){
    int y = 1;
    while(programkod[x] == '+' || programkod[x] == '-'){
        x++;
        switch(programkod[x]){
            case '-' : y++;
            break;
            case '+' : y--;
            break;
        }
    }
    return y;
}

int kovetkezo_elem(int x){
    int y = 0;
    switch(programkod[x]){
        case '>' : while(programkod[x] == '>' || programkod[x] == '<'){
                        y++;
                        x++;
                    }
        break;
        case '<' : while(programkod[x] == '>' || programkod[x] == '<'){
                        y++;
                        x++;
                    }
        break;
        case '+' : while(programkod[x] == '+' || programkod[x] == '-'){
                        y++;
                        x++;
                    }
        break;
        case '-' : while(programkod[x] == '+' || programkod[x] == '-'){
                        y++;
                        x++;
                    }
        break;
    }
    y--;
    return y;
}

void behuzas(int x){
    int n;
    for(n=1; n<=x; n++){
        printf("\t");
    }
    return;
}



Learn More :