osdev-jpでは、OS開発に有用な情報を収集し公開しています

View My GitHub Profile

OpeLa で RPN

OpeLa で RPN(逆ポーランド記法電卓)を実装してみました。

OpeLa メインページ

2020/09/30 時点のコンパイラを使用したバージョン

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