2019-11-02追記
yoctoのサンプルプロジェクトようにこの記事のコードを使って試していたらいくつかバグがありましたので修正しました。
具体的には本記事のコードでマイナスがうまく扱えていませんでした。
例えば、
./calc "3 - 3 + 3"
のような計算がうまくできていませんでした。
修正したコードを含めたものを
github.com
に挙げております。
記事中のコードはそのままとしておりますので参考にされる方はご注意ください。
記事本文
随分と前の話ですが、「小飼弾のコードなエッセイ」を読んで、「C言語でもevaりたい」という記事を書きました。
mcommit.hatenadiary.com
そちらの記事でも書きましたが、この本の最初のエッセイに、
「堂々とevaろう。でもevaりすぎにご用心。」
というエッセイがあって、evalの便利さについて語られているのですが、私が書いた記事ではC言語でevalっぽいことをしてみるという記事を書いていました。
その際に、eval的なことをせずに、C言語でガリガリと電卓を書いてみたのですが、結果としてあまりうまく書けていませんでした。
特に演算子の優先順位に対応できておらず、また対応させる為にはかなり面倒なコードを書かないといけないと思っていました。※あるいはflexやbisonを使えば比較的行数も少なくは実装はできますが。
このevalの記事を書いたのは3年以上前の話なのですが、最近になって(挫折していた)コンパイラ自作の勉強を再開してみて、C言語でもう少しまともに電卓を書く方法が分かったので記事として書いておきたいと思います。
- 2019-11-02追記
- 記事本文
- 書いてみた電卓プログラム(C言語)
- なぜ電卓プログラムを書いてみたか?
- 感想
- 構文解析の実装
- 余談
続きを読む