119 lines
2.1 KiB
Plaintext
119 lines
2.1 KiB
Plaintext
record BFI
|
|
{
|
|
cmd : char;
|
|
next : BFI;
|
|
jmp : BFI;
|
|
}
|
|
|
|
record MEM
|
|
{
|
|
val : int;
|
|
next : MEM;
|
|
prev : MEM;
|
|
}
|
|
|
|
func compile(prog : string) -> BFI
|
|
{
|
|
var i = 0;
|
|
var n = BFI;
|
|
var p = BFI;
|
|
var j = BFI;
|
|
var pgm = BFI;
|
|
|
|
for (i = 0; i < length(prog); i = i + 1) {
|
|
n = BFI('0', nil, nil);
|
|
|
|
if (p != nil) {
|
|
p.next = n
|
|
} else {
|
|
pgm = n
|
|
};
|
|
|
|
n.cmd = prog[i];
|
|
p = n;
|
|
|
|
if (prog[i] == '[') {
|
|
n.jmp = j;
|
|
j = n;
|
|
0
|
|
} else if (prog[i] == ']') {
|
|
n.jmp = j;
|
|
j = j.jmp;
|
|
n.jmp.jmp = n;
|
|
0
|
|
} else {
|
|
0
|
|
}
|
|
};
|
|
|
|
pgm
|
|
}
|
|
|
|
func exec(pgm : BFI) -> int
|
|
{
|
|
var m = MEM(0, nil, nil);
|
|
var n = BFI;
|
|
|
|
for (n = pgm; n != nil; n = n.next) {
|
|
if (n.cmd == '+') {
|
|
m.val = m.val + 1
|
|
} else if (n.cmd == '-') {
|
|
m.val = m.val - 1
|
|
} else if (n.cmd == '.') {
|
|
printc(chr(m.val));
|
|
0
|
|
} else if (n.cmd == ',') {
|
|
m.val = read()
|
|
} else if (n.cmd == '[') {
|
|
if (m.val == 0) {
|
|
n = n.jmp;
|
|
0
|
|
} else {
|
|
0
|
|
}
|
|
} else if (n.cmd == ']') {
|
|
if (m.val != 0) {
|
|
n = n.jmp;
|
|
0
|
|
} else {
|
|
0
|
|
}
|
|
} else if (n.cmd == '<') {
|
|
m = m.prev;
|
|
0
|
|
} else if (n.cmd == '>') {
|
|
if (m.next == nil) {
|
|
m.next = MEM(0, nil, nil);
|
|
m.next.prev = m;
|
|
0
|
|
} else {
|
|
0
|
|
};
|
|
|
|
m = m.next;
|
|
0
|
|
} else {
|
|
0
|
|
}
|
|
};
|
|
|
|
0
|
|
}
|
|
|
|
func run(prog : string) -> int
|
|
{
|
|
var pgm = BFI;
|
|
|
|
pgm = compile(prog);
|
|
exec(pgm);
|
|
|
|
0
|
|
}
|
|
|
|
func main() -> int
|
|
{
|
|
/* Hello World! */
|
|
run("++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.");
|
|
0
|
|
}
|