はじめに
eval
関数とは文字列を式として評価する関数です。eval
はC言語などのコンパイラ言語にはほとんどないですが,JavaScriptなどのインタプリタ言語で一般的です。ここではC言語のための文字列を数式として処理するeval
風関数を作成します。ソースコードはGitHubにあげてあります。
主な仕様
eval
は引数の数式を計算し,その結果を戻り値とする関数にします。eval
ではsin
,exp
,sqrt
などのmath.h
にある関数が使えるようにします。関数を含めた数式の計算順は次のようになります。計算過程は全て文字列として処理を行います。
- 関数:
sin
,exp
,sqrt
など - 括弧:
(
,)
- 乗法,除法:
*
,\
- 加法,減法:
+
,-
関数の計算を行うcalcfunc
,四則演算を行うcalc
を作成します。括弧の処理にはeval
を使用します。プログラムの疑似コード(?)と共に説明します。実際のソースコードは長いのでGitHubを参照してください。実装は基本的に単純で,上記の箇条書きの順番通りに計算するだけです。
|
|
処理の流れの例
引数に3*sqrt(4)+(5-2)
とした時を例にして説明します。まず都合が良くするために全体に(
,)
を付けます。
次に計算の順番通りに関数を呼び出し計算します。
次に*
,\
による計算をcalc
を用いて行います。最後に+
,-
による計算を行います。最終的に残った値を実数値としてreturn
します。
まとめ・今後
C言語用のeval
風関数を作成しました。calc
等の関数について触れませんでしたが,説明を付け加えるかもしれません。ぜひ構文解析等の勉強に役立てばと思います。今後の課題としてメモリを多用する,処理速度が遅いなどが挙げられるので改善したいです。また,バグがあるかもしません。