RosettaCodeData/Task/Execute-Brain-/Never/execute-brain-.never

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
}