|
|
1.1 root 1: #
2: # I N F I X - T O - P R E F I X C O N V E R S I O N
3: #
4:
5: # This program accepts infix expressions from standard input and
6: # writes the corresponding prefix expressions to standard output.
7:
8: procedure main()
9: while write(prefix(read()))
10: end
11:
12: procedure prefix(s)
13: s := strip(s)
14: return lassoc(s,'+-' | '*/') | rassoc(s,'^') | s
15: end
16:
17: procedure strip(s)
18: while s ? (="(" & s <- tab(bal(')')) & pos(-1))
19: return s
20: end
21:
22: procedure lassoc(s,c)
23: local j
24: s ? every j := bal(c)
25: return form(s,\j)
26: end
27:
28: procedure rassoc(s,c)
29: local j
30: return form(s,s ? bal(c))
31: end
32:
33: procedure form(s,k)
34: local a1, a2, op
35: s ? {
36: a1 := tab(k)
37: op := move(1)
38: a2 := tab(0)
39: }
40: return op || "(" || prefix(a1) || "," || prefix(a2) || ")"
41: end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.