aboutsummaryrefslogtreecommitdiff
path: root/exp2ook.sc
diff options
context:
space:
mode:
Diffstat (limited to 'exp2ook.sc')
-rw-r--r--exp2ook.sc94
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)
+}