June 2018 Update
This commit is contained in:
parent
ba8067c3b7
commit
22f33d4004
5278 changed files with 84726 additions and 14379 deletions
|
|
@ -0,0 +1,4 @@
|
|||
IN: scratchpad 3 4 2 * 1 5 - 2 3 ^ ^ / +
|
||||
|
||||
--- Data stack:
|
||||
3+1/8192
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
{ 3 4 2 * 1 5 - 2 3 ^ ^ / + } [ 1quotation ] map
|
||||
[ dup pprint bl call datastack . ] each
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
rmod(i, j) := mod(j, i)$
|
||||
rpow(x, y) := y^x$
|
||||
|
||||
rpn(sexpr) := (
|
||||
operands: [],
|
||||
expr: charlist(sexpr),
|
||||
|
||||
for token in expr do (
|
||||
if token = "+" then (
|
||||
push(pop(operands) + pop(operands), operands)
|
||||
)
|
||||
elseif token = "-" then (
|
||||
push(-1 * (pop(operands) - pop(operands)), operands)
|
||||
)
|
||||
elseif token = "*" then (
|
||||
push(pop(operands) * pop(operands), operands)
|
||||
)
|
||||
elseif token = "/" then (
|
||||
push(1 / (pop(operands) / pop(operands)), operands)
|
||||
)
|
||||
elseif token = "%" then (
|
||||
push(rmod(pop(operands), pop(operands)), operands)
|
||||
)
|
||||
elseif token = "^" then (
|
||||
push(rpow(pop(operands), pop(operands)), operands)
|
||||
)
|
||||
elseif token # " " then (
|
||||
push(parse_string(token), operands)
|
||||
),
|
||||
|
||||
if token # " " then (
|
||||
print(token, " : ", operands)
|
||||
)
|
||||
),
|
||||
|
||||
pop(operands)
|
||||
)$
|
||||
|
||||
rpn("3 4 2 * 1 5 - 2 3 ^ ^ / +"), numer;
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
(%i5) ev(rpn("3 4 2 * 1 5 - 2 3 ^ ^ / +"),numer)
|
||||
3 : [3]
|
||||
4 : [4, 3]
|
||||
2 : [2, 4, 3]
|
||||
* : [8, 3]
|
||||
1 : [1, 8, 3]
|
||||
5 : [5, 1, 8, 3]
|
||||
- : [- 4, 8, 3]
|
||||
2 : [2, - 4, 8, 3]
|
||||
3 : [3, 2, - 4, 8, 3]
|
||||
^ : [8, - 4, 8, 3]
|
||||
^ : [65536, 8, 3]
|
||||
/ : [1.220703125e-4, 3]
|
||||
+ : [3.0001220703125]
|
||||
(%o5) 3.0001220703125
|
||||
|
|
@ -0,0 +1,118 @@
|
|||
.ig
|
||||
RPN parser implementation in TROFF
|
||||
|
||||
Originally written on November 21, 2017.
|
||||
Modified for Rosettacode on December 3, 2017.
|
||||
|
||||
Stephanie Björk (Katt) <katt16777216@gmail.com>
|
||||
..
|
||||
.\" \(*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
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
3
|
||||
3 4
|
||||
3 4 2
|
||||
3 8
|
||||
3 8 1
|
||||
3 8 1 5
|
||||
3 8 ‐4
|
||||
3 8 ‐4 2
|
||||
3 8 ‐4 2 3
|
||||
3 8 ‐4 8
|
||||
3 8 16
|
||||
3 0
|
||||
3
|
||||
3
|
||||
|
|
@ -0,0 +1,89 @@
|
|||
.ig
|
||||
===========================
|
||||
Array implementation
|
||||
===========================
|
||||
..
|
||||
.de end
|
||||
..
|
||||
.de array
|
||||
. nr \\$1.c 0 1
|
||||
. de \\$1.push end
|
||||
. nr \\$1..\\\\n+[\\$1.c] \\\\$1
|
||||
. end
|
||||
. de \\$1.pop end
|
||||
. if \\\\n[\\$1.c]>0 \{ \
|
||||
. rr \\$1..\\\\n[\\$1.c]
|
||||
. nr \\$1.c -1\
|
||||
. \}
|
||||
. end
|
||||
. de \\$1.dump end
|
||||
. nr i 0 1
|
||||
. rm ou
|
||||
. while \\\\n+i<=\\\\n[\\$1.c] \{ \
|
||||
. as ou "\\\\n[\\$1..\\\\ni]
|
||||
. \}
|
||||
. tm \\\\*(ou
|
||||
. rr i
|
||||
. end
|
||||
..
|
||||
.ig
|
||||
==========================
|
||||
End array implementation
|
||||
==========================
|
||||
..
|
||||
.array stack
|
||||
.de hyper3
|
||||
. nr rs 1
|
||||
. nr i 0 1
|
||||
. while \\n+i<=\\$2 .nr rs \\n(rs*\\$1
|
||||
. rr i
|
||||
..
|
||||
.de pop2
|
||||
. nr O2 \\n[\\$1..\\n[\\$1.c]]
|
||||
. \\$1.pop
|
||||
. nr O1 \\n[\\$1..\\n[\\$1.c]]
|
||||
. \\$1.pop
|
||||
..
|
||||
.de rpn
|
||||
. ie '\\$1'+' \{ \
|
||||
. pop2 stack
|
||||
. nr rs \\n(O1+\\n(O2
|
||||
. \}
|
||||
. el \{ \
|
||||
. ie '\\$1'-' \{ \
|
||||
. pop2 stack
|
||||
. nr rs \\n(O1-\\n(O2
|
||||
. \}
|
||||
. el \{ \
|
||||
. ie '\\$1'*' \{ \
|
||||
. pop2 stack
|
||||
. nr rs \\n(O1*\\n(O2
|
||||
. \}
|
||||
. el \{ \
|
||||
. ie '\\$1'/' \{ \
|
||||
. pop2 stack
|
||||
. nr rs \\n(O1/\\n(O2
|
||||
. \}
|
||||
. el \{ \
|
||||
. ie '\\$1'%' \{ \
|
||||
. pop2 stack
|
||||
. nr rs \\n(O1%\\n(O2
|
||||
. \}
|
||||
. el \{ \
|
||||
. ie '\\$1'^' \{ \
|
||||
. pop2 stack
|
||||
. hyper3 \\n(O1 \\n(O2
|
||||
. \}
|
||||
. el .nr rs \\$1
|
||||
. \}\}\}\}\}
|
||||
.
|
||||
. stack.push \\n(rs
|
||||
. stack.dump
|
||||
.
|
||||
. if \\n(.$>1 \{ \
|
||||
. shift
|
||||
. rpn \\$@
|
||||
. \}
|
||||
..
|
||||
.rpn 3 4 2 * 1 5 - 2 3 ^ ^ / +
|
||||
.stack.dump
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
3
|
||||
3 4
|
||||
3 4 2
|
||||
3 8
|
||||
3 8 1
|
||||
3 8 1 5
|
||||
3 8 -4
|
||||
3 8 -4 2
|
||||
3 8 -4 2 3
|
||||
3 8 -4 8
|
||||
3 8 16
|
||||
3 0
|
||||
3
|
||||
3
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
estack = [];
|
||||
|
||||
epush(x) = {
|
||||
estack = vector(#estack + 1, i, if(i <= #estack, estack[i], x));
|
||||
return(#estack);
|
||||
};
|
||||
|
||||
epop() = {
|
||||
local(val = estack[#estack]);
|
||||
estack = vector(#estack - 1, i, estack[i]);
|
||||
return(val);
|
||||
};
|
||||
|
||||
registerRPNToken(t) = {
|
||||
local(o1, o2);
|
||||
|
||||
if(type(t) == "t_STR",
|
||||
if(t == "+", o2 = epop(); o1 = epop(); epush(o1 + o2),
|
||||
if(t == "-", o2 = epop(); o1 = epop(); epush(o1 - o2),
|
||||
if(t == "*", o2 = epop(); o1 = epop(); epush(o1 * o2),
|
||||
if(t == "/", o2 = epop(); o1 = epop(); epush(o1 / o2),
|
||||
if(t == "%", o2 = epop(); o1 = epop(); epush(o1 % o2),
|
||||
if(t == "^", o2 = epop(); o1 = epop(); epush(o1 ^ o2)
|
||||
)))))),
|
||||
if(type(t) == "t_INT" || type(t) == "t_REAL" || type(t) == "t_FRAC",
|
||||
epush(t))
|
||||
);
|
||||
print(estack);
|
||||
};
|
||||
|
||||
parseRPN(s) = {
|
||||
estack = [];
|
||||
for(i = 1, #s, registerRPNToken(s[i]));
|
||||
|
||||
if(#estack > 1, error("Malformed postfix expression."));
|
||||
return(estack[1]);
|
||||
};
|
||||
|
||||
parseRPN([3, 4, 2, "*", 1, 5, "-", 2, 3, "^", "^", "/", "+"]); \\ Our input expression
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
[3]
|
||||
[3, 4]
|
||||
[3, 4, 2]
|
||||
[3, 8]
|
||||
[3, 8, 1]
|
||||
[3, 8, 1, 5]
|
||||
[3, 8, -4]
|
||||
[3, 8, -4, 2]
|
||||
[3, 8, -4, 2, 3]
|
||||
[3, 8, -4, 8]
|
||||
[3, 8, 65536]
|
||||
[3, 1/8192]
|
||||
[24577/8192]
|
||||
|
|
@ -0,0 +1,65 @@
|
|||
#!/bin/sh
|
||||
|
||||
exp() {
|
||||
R=1
|
||||
local i=1
|
||||
|
||||
while [ $i -le $2 ]; do
|
||||
R=$(($R * $1))
|
||||
i=$(($i + 1))
|
||||
done
|
||||
}
|
||||
|
||||
rpn() {
|
||||
local O1 O2 stack
|
||||
|
||||
while [ $# -ge 1 ]; do
|
||||
grep -iE '^-?[0-9]+$' <<< "$1" > /dev/null 2>&1
|
||||
if [ "$?" -eq 0 ]; then
|
||||
stack=`sed -e '$a'"$1" -e '/^$/d' <<< "$stack"`
|
||||
else
|
||||
grep -iE '^[-\+\*\/\%\^]$' <<< "$1" > /dev/null 2>&1
|
||||
if [ "$?" -eq 0 ]; then
|
||||
O2=`sed -n '$p' <<< "$stack"`
|
||||
stack=`sed '$d' <<< "$stack"`
|
||||
O1=`sed -n '$p' <<< "$stack"`
|
||||
|
||||
case "$1" in
|
||||
'+')
|
||||
stack=`sed -e '$a'"$(($O1 + $O2))" -e '/^$/d' -e '$d' \
|
||||
<<< "$stack"`;;
|
||||
'-')
|
||||
stack=`sed -e '$a'"$(($O1 - $O2))" -e '/^$/d' -e '$d' \
|
||||
<<< "$stack"`;;
|
||||
'*')
|
||||
stack=`sed -e '$a'"$(($O1 * $O2))" -e '/^$/d' -e '$d' \
|
||||
<<< "$stack"`;;
|
||||
'/')
|
||||
stack=`sed -e '$a'"$(($O1 / $O2))" -e '/^$/d' -e '$d' \
|
||||
<<< "$stack"`;;
|
||||
'%')
|
||||
stack=`sed -e '$a'"$(($O1 % $O2))" -e '/^$/d' -e '$d' \
|
||||
<<< "$stack"`;;
|
||||
'^')
|
||||
exp $O1 $O2
|
||||
stack=`sed -e '$a'"$(($R))" -e '/^$/d' -e '$d' <<< \
|
||||
"$stack"`;;
|
||||
esac
|
||||
else
|
||||
echo "Unknown RPN token \`\`$1''"
|
||||
fi
|
||||
fi
|
||||
echo "$1" ":" $stack
|
||||
shift
|
||||
done
|
||||
|
||||
sed -n '1p' <<< "$stack"
|
||||
if [ "`wc -l <<< "$stack"`" -gt 1 ]; then
|
||||
echo "Malformed input expression" > /dev/stderr
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
fi
|
||||
}
|
||||
|
||||
rpn 3 4 2 '*' 1 5 '-' 2 3 '^' '^' '/' '+'
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
3 : 3
|
||||
4 : 3 4
|
||||
2 : 3 4 2
|
||||
* : 3 8
|
||||
1 : 3 8 1
|
||||
5 : 3 8 1 5
|
||||
- : 3 8 -4
|
||||
2 : 3 8 -4 2
|
||||
3 : 3 8 -4 2 3
|
||||
^ : 3 8 -4 8
|
||||
^ : 3 8 65536
|
||||
/ : 3 0
|
||||
+ : 3
|
||||
3
|
||||
Loading…
Add table
Add a link
Reference in a new issue