write ahead log

ロールフォワード用

真面目に電卓を作った

電卓を作る.簡単そうで難しい.
情報系大学出身者なら誰でもできそうなもんだけど、案外大変だった.
未熟だなぁ、と思った.

出来たのは以下.バグもあるかもしれない.(まぁ、あるだろうね)テストも途中から手抜き気味.

https://github.com/twinbird/learning_compilergithub.com

動かすと下記のような感じ.

twinbird@:~/lab/lang$ ruby main.rb "12 - 3 + 5"
Program
-----------------------------------
"12 - 3 + 5"
-----------------------------------

Tokens
-----------------------------------
["12", "-", "3", "+", "5"]
-----------------------------------

AST
-----------------------------------
+
 |--- -
      |--- 12
      |--- 3
 |--- 5
-----------------------------------

Result
-----------------------------------
14.0
-----------------------------------

手抜きなので引数なしだとテストサンプルが走る.

twinbird@:~/lab/lang$ ruby main.rb 
Program
-----------------------------------
"12+3+5/(1+3)*(6-2)"
-----------------------------------

Tokens
-----------------------------------
["12", "+", "3", "+", "5", "/", "(", "1", "+", "3", ")", "*", "(", "6", "-", "2", ")"]
-----------------------------------

AST
-----------------------------------
+
 |--- +
      |--- 12
      |--- 3
 |--- *
      |--- /
           |--- 5
           |--- +
                |--- 1
                |--- 3
      |--- -
           |--- 6
           |--- 2
-----------------------------------

Result
-----------------------------------
20.0
-----------------------------------

ASTなんて表示してるけど、そんな大したものなのかも正直よくわからない.

ただ、今回

  1. 数値や演算子ごとに文字を切り取る(字句解析)

  2. 意味ある形に木を構築する(構文解析.というか構文木作成)

  3. 木を辿って計算する(評価)

というステップを踏めたので勉強にはなった.
ホントは3ではなくアセンブラを吐かせて翻訳機も作ってみたいんだけど、ここらで一区切りにする.

GASも面白かったので何かしらコンパイラ関連の本を読んで(薄くて簡単なのがいいなぁ)手探りで何か作ると面白いかもしれない.
とはいえ、子供も生まれたのでしばらくはお預けかなぁ.