電卓自作した話

最近、プログラムというものがどういう仕組みで実行されるに至るのかに興味あって、言語処理系について調べていました。
研究室の先輩なんかは、「あーそれやったわー。数年前にやったわー。数年前やったなー」とか言ってた気がするので、たいした話ではないと思うんですが、個人的には初めての試みだったので結構楽しかったです。
(狭義の)言語処理というのは要するに、ソースコードを読んで、①最小単位(トークン)に分割 ②構文解析③実行(③はもっと細かく分けるべきだと思いますが)しているだけなんですね。
もっと難解なことをやってるイメージがあったので意外でした。
正規表現やら文脈自由文法、およびこれらを処理するためのアルゴリズムの話はそれはそれで面白いのですが、どうせなら動くものをみたいと思い、手始めに電卓を自作しました。

字句解析プログラム生成にはflex構文解析プログラム生成にはbisonを使いました。
ソースはこんな感じ。(https://github.com/risuoku/oreore/tree/master/dentaku
四則演算と、演算の優先度を変更するための括弧が使えます。
ビルドしてから引数無しで実行すると、標準入力から入力を受け付け、結果を標準出力に出力します。
電卓というからには当たり前なのですが、3+2*3は9を出力するのであって15ではありません。逆に、(3+2)*3は15を出力します。

ただ、色々手抜きがあって、例えば各数値はC言語のdoubleで値を保持しているので常に小数で出力されます。あと、bisonを実行するとshift/reduce conflictがおきたり、gccすると警告でたりします。

実は、もう少し言語処理系っぽいものを作ろうとしたのですが、ちょっとforやらifやら入るだけでかなり複雑になるので途中で挫折しました。いつかリベンジしたいです。