電卓を作る.簡単そうで難しい.
情報系大学出身者なら誰でもできそうなもんだけど、案外大変だった.
未熟だなぁ、と思った.
出来たのは以下.バグもあるかもしれない.(まぁ、あるだろうね)テストも途中から手抜き気味.
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なんて表示してるけど、そんな大したものなのかも正直よくわからない.
ただ、今回
数値や演算子ごとに文字を切り取る(字句解析)
意味ある形に木を構築する(構文解析.というか構文木作成)
木を辿って計算する(評価)
というステップを踏めたので勉強にはなった.
ホントは3ではなくアセンブラを吐かせて翻訳機も作ってみたいんだけど、ここらで一区切りにする.
GASも面白かったので何かしらコンパイラ関連の本を読んで(薄くて簡単なのがいいなぁ)手探りで何か作ると面白いかもしれない.
とはいえ、子供も生まれたのでしばらくはお預けかなぁ.