ふつーにてこずってます

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 がうまくない。

test