#!/usr/local/bin/snobol4 -b * Arithmetic expression to Brainfuck/Ook! compiler * ./exp2ook.sno [-bf] "expression" * Compiles "expression" and prints Ook! source to stdout * "-bf" prints the Brainfuck source only * The compiled programs calculate the result and display it (ASCII letters) EXP2OOK CODE('EXP2OOK') DEFINE('PUSH()') DEFINE('POP()') DEFINE('BINOP()NEW') DEFINE('COMPILE(NODE)O') DATA('OP(R,TYPE,L)') &ANCHOR = 1 &FULLSCAN = 1 SPACE = SPAN(" ") | "" PRE = SPACE ("(" *EXP SPACE ")" | SPAN("0123456789") $ *PUSH()) POST = SPACE (ANY("+-") $ *PUSH() *EXP *BINOP() | + ANY("*/") $ *PUSH() PRE *BINOP() *POST) | "" EXP = PRE POST I = HOST(3) L.3 HOST(2, I) "-" :F(L.4) I = I + 1 :(L.3) L.4 HOST(2, I) :S(L.5) TERMINAL = "No expression specified!" :(END) L.5 STACK = ARRAY(10) SP = 0 TRIM(HOST(2, I)) EXP RPOS(0) :S(L.6) TERMINAL = "Invalid expression!" :(END) L.6 SRC = COMPILE(STACK<1>) + "[>++++++++++<[->->+>>+<<<[>>+>[-]<<<-]>>[<<+>>-]" + ">[-<<[<+>-]>>>+<]<<<<]>>>>>[<<<<<+>>>>>-]>[>]" DUPL("+",ORD("0")) + "[<]<<<[>>>>[>]<+[<]<<<-]<[-]<]>>>>>>[>]<[.<]" LEQ(HOST(2, HOST(3)), "-bf") :F(L.9) OUTPUT = SRC :(END) L.9 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) :(END) * PROCEDURES PUSH PUSH = .STACK :(NRETURN) POP POP = STACK SP = SP - 1 :(RETURN) BINOP NEW = OP(POP(), POP(), POP()) PUSH() = NEW :(RETURN) COMPILE LEQ(DATATYPE(NODE), .OP) :S(L.8) COMPILE = DUPL("+", NODE) :(RETURN) L.8 COMPILE = COMPILE(L(NODE)) ">" COMPILE(R(NODE)) TYPE(NODE) ANY("+-") $ O *?(COMPILE = COMPILE "[<" O ">-]<") | + "*" *?(COMPILE = ">>" COMPILE "[<[<+<+>>-]<[>+<-]>>-]<[-]<<") | + "/" *?(COMPILE = ">" COMPILE "<[->->+>>+<<<[>>+>[-]<<<-]>>" + "[<<+>>-]>[-<<[<+>-]<<<+>>>>>]<<<<]>[-]>[-]<<<") :(RETURN) END EXP2OOK