#include <stdio.h>
#include <stdlib.h>
#define SIZE 5000
char data[SIZE], code[SIZE];
int ptr, flag;
void interpreter(char *ip)
{
char* re;
while (*ip)
{
switch(*ip++)
{
case '<': --ptr; break;
case '>': ++ptr; break;
case '+': ++data[ptr]; break;
case '-': --data[ptr]; break;
case '.': putchar(data[ptr]); fflush(stdout); break;
case ',': data[ptr] = getchar(); fflush(stdout); break;
case '[': for (flag=1,re=ip; flag && *ip; ++ip)
flag += *ip=='[', flag -= *ip==']';
if(!flag)
{
ip[-1] = 0;
while (data[ptr])
interpreter(re);
ip[-1] = ']';
break;
}
case ']': puts("Unbalancded brackets!"), exit(-3);
default : ;//SKIP
}
if (ptr < 0 || ptr > 100)
puts("Out of Range"), exit(-4);
}
}
int main(int argc, char *argv[])
{
FILE *fin;
int codelength;
if (argc != 2)
return puts("BrainFuck Interpreter v 0.1\nStar\nUsage:BFI filename"), 0;
if ((fin = fopen(argv[1], "r")) == NULL)
return puts("Cannot open file!"), -1;
fseek(fin, 0, SEEK_END);
if ((codelength = ftell(fin)) > SIZE)
return puts("The program is too large."), -2;
fseek(fin, 0, SEEK_SET);
fread(code, codelength, 1, fin);
code[codelength] = '\0';
interpreter(code);
return 0;
}有些地方不太明白,有空的帮个忙吧,谢谢!
#include <stdlib.h>
#define SIZE 5000
char data[SIZE], code[SIZE];
int ptr, flag;
void interpreter(char *ip)
{
char* re;
while (*ip)
{
switch(*ip++)
{
case '<': --ptr; break;
case '>': ++ptr; break;
case '+': ++data[ptr]; break;
case '-': --data[ptr]; break;
case '.': putchar(data[ptr]); fflush(stdout); break;
case ',': data[ptr] = getchar(); fflush(stdout); break;
case '[': for (flag=1,re=ip; flag && *ip; ++ip)
flag += *ip=='[', flag -= *ip==']';
if(!flag)
{
ip[-1] = 0;
while (data[ptr])
interpreter(re);
ip[-1] = ']';
break;
}
case ']': puts("Unbalancded brackets!"), exit(-3);
default : ;//SKIP
}
if (ptr < 0 || ptr > 100)
puts("Out of Range"), exit(-4);
}
}
int main(int argc, char *argv[])
{
FILE *fin;
int codelength;
if (argc != 2)
return puts("BrainFuck Interpreter v 0.1\nStar\nUsage:BFI filename"), 0;
if ((fin = fopen(argv[1], "r")) == NULL)
return puts("Cannot open file!"), -1;
fseek(fin, 0, SEEK_END);
if ((codelength = ftell(fin)) > SIZE)
return puts("The program is too large."), -2;
fseek(fin, 0, SEEK_SET);
fread(code, codelength, 1, fin);
code[codelength] = '\0';
interpreter(code);
return 0;
}有些地方不太明白,有空的帮个忙吧,谢谢!
不过写的不怎么好,int ptr, flag; 也没初始化,--ptr会输出一个错误的数值,但是无关紧要,因为根本就不会调用到 interpreter这个函数
恩 是一种代码的解释器。看看能帮忙翻译成JAVA吗?
import java.util.*;class SomeClass {
static final int SIZE = 5000;
static char[] data = new char[SIZE];
static char[] code = new char[SIZE];
static int ptr, flag; public static void interpreter(char[] ip, int pos) {
int i = pos, j = 0;
while (ip[i] != '\0') {
switch(ip[i++]) {
case '<':
--ptr;
break;
case '>':
++ptr;
break;
case '+':
++data[ptr];
break;
case '-':
--data[ptr];
break;
case '.':
System.out.println(data[ptr]);
System.out.flush();
break;
case ',':
try {
data[ptr] = (char)(System.in.read());
System.out.flush();
} catch (Exception e) {
e.printStackTrace();
}
break;
case '[': //这里的逻辑有点不太清楚
for (flag=1, j=i; flag > 0 && ip[i] != '\0'; ++i) {
if (ip[i] == '[') {flag++;}
if (ip[i] == ']') {flag--;}
}
if(flag > 0) {
ip[i-1] = (char)0;
while (data[ptr] > '\0') {
interpreter(ip, j);
}
ip[i-1] = ']';
break; //C++中的这个break能退到什么级别?这里的处理有点不太清楚
}
break; //java中没这个break会继续执行下面的代码,估计这里和原程序有点出入
case ']':
System.out.println("Unbalancded brackets!");
System.exit(-3);
default :
break;//SKIP
}
if (ptr < 0 || ptr > 100) {
System.out.println("Out of Range");
System.exit(-4);
}
}
} public static void main(String[] args) {
File fin;
int codelength; if (args.length != 1) {
System.out.println("BrainFuck Interpreter v 0.1\nStar\nUsage:BFI filename");
System.exit(0);
}
try {
fin = new File(args[0]);
codelength = (int)fin.length();
if (codelength > SIZE) {
System.out.println("The program is too large.");
System.exit(-2);
}
FileReader fr = new FileReader(fin);
Arrays.fill(code, '\0');
fr.read(code, 0, codelength);
fr.close();
System.exit(0);
} catch (Exception e) {
System.out.println("Cannot open file!");
System.exit(-1);
}
}
}
fr.close();
interpreter(code, 0);
System.exit(0);