diff options
Diffstat (limited to 'tests/general/prefix.icn')
-rw-r--r-- | tests/general/prefix.icn | 41 |
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 |