ふつーにてこずってます
COINS で書いてる Brainfuck コンパイラが。うーん。なんか「,.」あたりは呼べたりすっけど、あちこちのほげが volatile でほげほげとか言われたり。たぶん volatile がどうこうとかいうわけじゃなくて、ふつーにへぼく間違いまくったコード書いてんだと思う。いいかげんちゃんと http://www.coins-project.org/ のドキュメントとか読まなきゃいけないのかもしれない。
Brainfuck -> C は簡単
まあ、書くまでもないことか。つーかまあ Brainfuck -> HIR も簡単なんだろうけど、俺が HIR の構造と COINS の使い方をよくわかってないから書けてねえだけだな。
#include <stdio.h> int bfc(FILE *); int main(int argc, char *argv[]){ FILE *fp; if(argc==1) return 0; if((fp = fopen(argv[argc-1], "r")) == NULL){ printf("cannot open file\n"); return 1; } bfc(fp); return 0; } int bfc(FILE *bf){ int c; puts("#include <stdio.h>"); puts("#define MAXMEM 30000"); puts("int main(){"); puts("static char mem[MAXMEM];"); puts("int mp = 0;"); while((c = fgetc(bf)) != EOF){ switch(c){ case '+': puts("++mem[mp];"); break; case '-': puts("--mem[mp];"); break; case '>': puts("++mp;"); break; case '<': puts("--mp;"); break; case '.': puts("putchar(mem[mp]);"); break; case ',': puts("mem[mp] = getchar();"); break; case '[': puts("while(mem[mp]){"); break; case ']': puts("}"); break; } } puts("return 0;}"); return 0; }
あーなるほど
VarNode とか使いまわしちゃ駄目なんだなー、とかやって少しは進む。HIR.assignStmt がうまくない。