summaryrefslogtreecommitdiff
path: root/tests/general/prefix.icn
diff options
context:
space:
mode:
Diffstat (limited to 'tests/general/prefix.icn')
-rw-r--r--tests/general/prefix.icn41
1 files changed, 41 insertions, 0 deletions
diff --git a/tests/general/prefix.icn b/tests/general/prefix.icn
new file mode 100644
index 0000000..0f6b0e0
--- /dev/null
+++ b/tests/general/prefix.icn
@@ -0,0 +1,41 @@
+#
+# I N F I X - T O - P R E F I X C O N V E R S I O N
+#
+
+# This program accepts infix expressions from standard input and
+# writes the corresponding prefix expressions to standard output.
+
+procedure main()
+ while write(prefix(read()))
+end
+
+procedure prefix(s)
+ s := strip(s)
+ return lassoc(s,'+-' | '*/') | rassoc(s,'^') | s
+end
+
+procedure strip(s)
+ while s ? (="(" & s <- tab(bal(')')) & pos(-1))
+ return s
+end
+
+procedure lassoc(s,c)
+ local j
+ s ? every j := bal(c)
+ return form(s,\j)
+end
+
+procedure rassoc(s,c)
+ local j
+ return form(s,s ? bal(c))
+end
+
+procedure form(s,k)
+ local a1, a2, op
+ s ? {
+ a1 := tab(k)
+ op := move(1)
+ a2 := tab(0)
+ }
+ return op || "(" || prefix(a1) || "," || prefix(a2) || ")"
+end