EVAL4

単位は数値リテラル、隣り合った数値リテラルは乗算記号で結ばれている扱いにする。1つの数値を検出したあと、演算子を検出しようと挑戦して、ダメだったら数値に戻る。先頭が[0-9]でないときは単位だろうとして判定する。単位でもなかったらエラー。「[」は次が単位で始まることを示す。いや、ただのカッコか?でもな、「km[4]」ってC言語じゃないんだから。まあ、ただのカッコで実装しても許されるかな。あとで、前が数値でない場合や、中身に単位でない数値があったときにエラー吐く機能を付けてもいい。

数値か演算子を格納するstd::vectorを用意する。これも美しくないなあ。別々に格納すると順番がなあ。順番を示す配列を用意するのもあれだし。問題は単項演算子。優先順位はバケットソートでいいよね。いや、分布数えか。STLでできればそれでいいけど。あかり新しいSTL大好き。

たとえば「-3**2」は優先順位に従って「**」が先に実行され-9になるけど、「3**-2」は「-」が先。これは、**の右側が数値でなかったからだろう。必ず単項演算子だよね。その単項演算子に、お前いますぐやれと言う。単項演算子の相手がまた単項演算子なら同様に。で、これですべての単項演算子が解決されるわけではない。ちゃんと優先順位に従ったのもやる。それでいいか。んー、「3**-2」みたいなのは、カッコのにおいがする。内部で「3**(-2)」としたい。しかし閉じカッコないからダメか。これは**の優先順位も絡むから単純には判定できない。

これでいけるか。いやあ、数値と演算子の管理がダメでしょ。具体的に決めないと。ていうか「この一手」というのが見えない限り決めるなんて無理なんだよ。これは少し寝かせよう。今日はここまで。