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 :
BF Compiler