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 }