RosettaCodeData/Task/Parsing-RPN-calculator-algorithm/N-t-roff/parsing-rpn-calculator-algorithm-1.n
2018-08-17 15:15:24 +01:00

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