procedure main() while write(fix(read())) end procedure fix(exp) while exp ?:= 2(="(",tab(bal(')')),pos(-1)) return lassoc(exp,'+-' | '*/') | rassoc(exp,'^') | exp end procedure lassoc(exp,op) local j return exp ? { every j := bal(op) form(tab(\j),move(1),tab(0)) } end procedure rassoc(exp,op) return exp ? form(tab(bal(op)),move(1),tab(0)) end procedure form(arg1,op,arg2) return op || "(" || fix(arg1) || "," || fix(arg2) || ")" end