diff options
author | Robin Haberkorn <rhaberkorn@fmsbw.de> | 2025-10-06 00:48:48 +0300 |
---|---|---|
committer | Robin Haberkorn <rhaberkorn@fmsbw.de> | 2025-10-06 00:48:48 +0300 |
commit | ad9e7cd5117c965222aae708f660e56d537914fc (patch) | |
tree | 580006656ec76513500170e5646e92e7819c6c0b /exp2ook.sc | |
download | snippets-ad9e7cd5117c965222aae708f660e56d537914fc.tar.gz |
imported all of my Github gists from https://gist.github.com/rhaberkorn
Diffstat (limited to 'exp2ook.sc')
-rw-r--r-- | exp2ook.sc | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/exp2ook.sc b/exp2ook.sc new file mode 100644 index 0000000..41b040f --- /dev/null +++ b/exp2ook.sc @@ -0,0 +1,94 @@ +# 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) +} |