Skip to content

Instantly share code, notes, and snippets.

Created July 3, 2012 14:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/3040025 to your computer and use it in GitHub Desktop.
Save anonymous/3040025 to your computer and use it in GitHub Desktop.
Brainf*ck風言語Prime(ver 0.0.1)インタプリタ
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//
// Brainf*ck風言語Primeのインタプリタ。
// 拡張しすぎてヤバめ。
// ソースコードを読めばだいたい動作は分かるんじゃないでしょうか。
// Brainf*ckのコードは+→),-→(に置換してやると動きます。
// 例)フィボナッチ数列挙
// ))))))))))>>)>)<[+<x=_)@>\<<.=>>>]
//
int main(int argc,char** argv)
{
int len = 10000;
FILE *fp;
if(argc < 2)
return 1;
fp = fopen(argv[1],"r");
if(fp == NULL)
return 2;
if(argc >= 3)
len = atoi(argv[2]);
long long str[len];
char prog[10001];
int plen;
if(fscanf(fp,"%10000[^\n]%*[^\n]",prog) == EOF)
{
fclose(fp);
return 3;
}
fclose(fp);
memset(str,0,len*8);
int c;
int i,j,k;
int pt = 0;
plen = strlen(prog);
for(i = 0;i < plen;i++)
{
switch(prog[i])
{
case ')':
str[pt]++;
break;
case '(':
str[pt]--;
break;
case '>':
if(pt != 9999)
pt++;
break;
case '<':
if(pt)
pt--;
break;
case '.':
putchar((char)str[pt]);
break;
case ',':
str[pt] = getchar();
break;
case '[':
case '@':
if(str[pt] == 0)
{
i++;
k = 1;
while(k)
{
if(i == plen)
return 4;
if(prog[i] == '[')
k++;
else if(prog[i] == ']')
k--;
i++;
}
}
break;
case ']':
if(str[pt] != 0)
{
i--;
k = 1;
while(k)
{
if(i < 0)
return 4;
if(prog[i] == '[')
k--;
else if(prog[i] == ']')
k++;
i--;
}
}
break;
case '+':
if(pt < 9998)
{
str[pt+2]=str[pt]+str[pt+1];
}
break;
case '-':
if(pt < 9998)
{
str[pt+2]=str[pt]-str[pt+1];
}
break;
case '*':
if(pt < 9998)
{
str[pt+2]=str[pt]*str[pt+1];
}
break;
case '/':
if(pt < 9998)
{
str[pt+2]=str[pt]/str[pt+1];
}
break;
case '%':
if(pt < 9998)
{
str[pt+2]=str[pt]%str[pt+1];
}
break;
case '&':
if(pt < 9998)
{
str[pt+2]=str[pt]&str[pt+1];
}
break;
case '|':
if(pt < 9998)
{
str[pt+2]=str[pt]|str[pt+1];
}
break;
case '^':
if(pt < 9998)
{
str[pt+2]=str[pt]^str[pt+1];
}
break;
case '~':
str[pt]=~str[pt];
break;
case '=':
if(pt < 9999)
{
str[pt+1]=str[pt];
}
break;
case 'x':
if(pt < 9999)
{
str[pt+1]^=str[pt];
str[pt]^=str[pt+1];
str[pt+1]^=str[pt];
}
break;
case '$':
scanf("%lld",&str[pt]);
break;
case '\\':
printf("%lld",str[pt]);
break;
case '#':
if(-1 < str[pt] && str[pt] < (plen-1))
i = str[pt] - 1;
break;
case '_':
if(str[pt] > 0)
str[pt] = 1;
else if(str[pt] < 0)
str[pt] = -1;
break;
default:
break;
}
fflush(stdout);
usleep(1000);//ゆっくり実行、取れば高速に動作します
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment