-
Notifications
You must be signed in to change notification settings - Fork 5
OpeLa RPN
Kota UCHIDA edited this page Sep 30, 2020
·
2 revisions
OpeLa で RPN(逆ポーランド記法電卓)を実装してみました。
func main() {
var stk [128]int;
stk_i := 0;
p := &"3 4 + 2 /"[0];
var a int;
var b int;
for i := 0; i < 9; i = i + 1 {
if p[i] == 32 {
} else if p[i] == 43 {
b = stk[stk_i];
a = stk[stk_i - 1];
stk[stk_i - 1] = a + b;
stk_i = stk_i - 1;
} else if p[i] == 45 {
b = stk[stk_i];
a = stk[stk_i - 1];
stk[stk_i - 1] = a - b;
stk_i = stk_i - 1;
} else if p[i] == 42 {
b = stk[stk_i];
a = stk[stk_i - 1];
stk[stk_i - 1] = a * b;
stk_i = stk_i - 1;
} else if p[i] == 47 {
b = stk[stk_i];
a = stk[stk_i - 1];
stk[stk_i - 1] = a / b;
stk_i = stk_i - 1;
} else {
stk_i = stk_i + 1;
stk[stk_i] = p[i] - 48;
}
}
var s [2]char;
s[0] = stk[stk_i] + 48;
s[1] = 10;
write(1, &s[0], 2);
}
extern "C" write func(fd int, s *char, n int);
実行すると 3 になります。
$ ./opelac < rpn.opl > rpn.s
$ nasm -f elf64 -o rpn.o rpn.s
$ cc -no-pie -o rpn.out rpn.o
$ ./rpn.out
3