# Snocone version (obscure C-like SNOBOL preprocessor) stack = array(10); sp = 0 procedure push() { nreturn .stack[sp = sp + 1] } procedure pop() { pop = stack[sp] sp = sp - 1 } procedure printstack() i { for (i = sp, i > 0, i = i - 1) output = stack[i] } struct op {r, type, l} procedure binop() new { new = op(pop(), pop(), pop()) push() = new } space = span(" ") | "" pre = space && "(" && *exp && space && ")" | space && span("0123456789") $ *push() post = space && any("+-") $ *push() && *exp && *binop() | space && any("*/") $ *push() && pre && *binop() && *post | "" exp = pre && post &anchor = 1 for (i = host(3), host(2, i) ? "-", i = i + 1) {} if (~host(2, i)) { terminal = "No expression specified!" go to end } if (~(trim(host(2, i)) ? exp && rpos(0))) { terminal = "Invalid expression!" go to end } procedure eval(node) left, right { if (datatype(node) :!=: .op) return convert(node, "integer") left = eval(l(node)) right = eval(r(node)) type(node) ? "+" && *?(eval = left + right) | "-" && *?(eval = left - right) | "*" && *?(eval = left * right) | "/" && *?(eval = left / right) } #output = eval(stack[1]) procedure compile(node) o { if (datatype(node) :!=: .op) return dupl("+", node) compile = compile(l(node)) && ">" && compile(r(node)) type(node) ? any("+-") $ o && *?(compile = compile && "[<" && o && ">-]<") | # a0 += a1 | a0 -= a1 "*" && *?(compile = ">>" && compile && "[<[<+<+>>-]<[>+<-]>>-]<[-]<<") | # a0 *= a1 "/" && *?(compile = ">" && compile && "<[->->+>>+<<<[>>+>[-]<<<-]>>[<<+>>-]>[-<<[<+>-]<<<+>>>>>]<<<<]>[-]>[-]<<<") # a0 /= a1 } src = compile(stack[1]) && "[>++++++++++<[->->+>>+<<<[>>+>[-]<<<-]>>[<<+>>-]>[-<<[<+>-]>>>+<]<<<<]>>>>>[<<<<<+>>>>>-]>[>]" && dupl("+", 48) && "[<]<<<[>>>>[>]<+[<]<<<-]<[-]<]>>>>>>[>]<[.<]" if (host(2, host(3)) :==: "-bf") { output = src } else { output(.term, 6, "t") src ? arbno("+" && *?(term = "Ook. Ook. ") | "-" && *?(term = "Ook! Ook! ") | ">" && *?(term = "Ook. Ook? ") | "<" && *?(term = "Ook? Ook. ") | "[" && *?(term = "Ook! Ook? ") | "]" && *?(term = "Ook? Ook! ") | "." && *?(term = "Ook! Ook. ") | len(1)) && rpos(0) }