114 lines
1.4 KiB
Text
114 lines
1.4 KiB
Text
.ig
|
|
RPN parser implementation in TROFF
|
|
|
|
..
|
|
.\" \(*A stack implementation
|
|
.nr Ac 0
|
|
.af Ac 1
|
|
.de APUSH
|
|
.if (\\n(Ac>=0)&(\\n(Ac<27) \{ \
|
|
. nr Ac +1
|
|
. af Ac A
|
|
. nr A\\n(Ac \\$1
|
|
. af Ac 1
|
|
\}
|
|
..
|
|
.de APOP
|
|
.if (\\n(Ac>0)&(\\n(Ac<27) \{ \
|
|
. af Ac A
|
|
. rr A\\n(Ac \\$1
|
|
. af Ac 1
|
|
. nr Ac -1
|
|
..
|
|
.\" Facility to print entire stack
|
|
.de L2
|
|
.af Ac 1
|
|
.if \\n(Li<=\\n(Ac \{ \
|
|
. af Li A
|
|
\\n(A\\n(Li
|
|
. af Li 1
|
|
. nr Li +1
|
|
. L2
|
|
\}
|
|
..
|
|
.de APRINT
|
|
.nr Li 1
|
|
.L2
|
|
.br
|
|
..
|
|
.\" Integer exponentiation algorithm
|
|
.de L1
|
|
.if \\n(Li<\\$2 \{ \
|
|
. nr Rs \\n(Rs*\\$1
|
|
. nr Li +1
|
|
. L1 \\$1 \\$2
|
|
\}
|
|
..
|
|
.de EXP
|
|
.nr Li 0
|
|
.nr Rs 1
|
|
.L1 \\$1 \\$2
|
|
..
|
|
.\" RPN Parser
|
|
.de REAP
|
|
.af Ac A
|
|
.nr O2 \\n(A\\n(Ac
|
|
.af Ac 1
|
|
.nr Ai \\n(Ac-1
|
|
.af Ai A
|
|
.nr O1 \\n(A\\n(Ai
|
|
.APOP
|
|
.APOP
|
|
..
|
|
.de RPNPUSH
|
|
.ie '\\$1'+' \{ \
|
|
. REAP
|
|
. nr Rs \\n(O1+\\n(O2
|
|
\}
|
|
.el \{ \
|
|
. ie '\\$1'-' \{ \
|
|
. REAP
|
|
. nr Rs \\n(O1-\\n(O2
|
|
\}
|
|
. el \{ \
|
|
. ie '\\$1'*' \{ \
|
|
. REAP
|
|
. nr Rs \\n(O1*\\n(O2
|
|
\}
|
|
. el \{ \
|
|
. ie '\\$1'/' \{ \
|
|
. REAP
|
|
. nr Rs \\n(O1/\\n(O2
|
|
\}
|
|
. el \{ \
|
|
. ie '\\$1'%' \{ \
|
|
. REAP
|
|
. nr Rs \\n(O1%\\n(O2
|
|
\}
|
|
. el \{ \
|
|
. ie '\\$1'^' \{ \
|
|
. REAP
|
|
. EXP \\n(O1 \\n(O2
|
|
\}
|
|
. el .nr Rs \\$1
|
|
\}
|
|
\}
|
|
\}
|
|
\}
|
|
\}
|
|
.APUSH \\n(Rs
|
|
.APRINT
|
|
..
|
|
.de RPNPRINT
|
|
.if \\n(Ac>1 .tm ERROR (rpn.roff): Malformed input expression. Evaluation stack size: \\n(Ac > 1 .
|
|
\\n(AA
|
|
..
|
|
.de RPNPARSE
|
|
.RPNPUSH \\$1
|
|
.ie \\n(.$>1 \{ \
|
|
. shift
|
|
. RPNPARSE \\$@
|
|
\}
|
|
.el .RPNPRINT
|
|
..
|
|
.RPNPARSE 3 4 2 * 1 5 - 2 3 ^ ^ / + \" Our input expression
|