toge's diary

コンピュータ関連の趣味をつらつらと。

ExprEvalの導入 -まずは触ってみる-

http://expreval.sourceforge.net/

以下ExprEvalの覚え書き。以前書いたようにちょっと修正しないといけない部分があるので、修正したものを置いておきます。

http://toge.skr.jp/program/expreval1_6-toge.zip

とりあえずコンパイルしましょう。といっもMakefileが用意されてないので、力技でテストプログラムをコンパイルしましょう。

> mkdir expreval
> cd expreval
> unzip ../expreval1_6-toge.zip
> gcc -O2 -lm -I. *.c test/test.c -o testExprEval
/tmp/xxxxxxxx.o(.text+0x157): In function `main':
test.c: warning: the `gets' function is dangerous and should not be used.

なんかgets使うなと怒られますが、まあここはよしとしましょう。
で、生成したものを実行しましょう。

> ./tesetExprEval
Enter expression: 5 + 3;
Count: 1
Final Value: 8.000000
Time: 0.000000
Average Time Each: 0.000000
res=: 0.000000

ちゃんと動いているみたいですね。式の最後の";"を省略するとエラーになっちゃいます。ちと不便ですな。
以下OKなものとNGなものを列挙してみましょう。

5 + 3; 5 * 3; // ";"で複数の式が書けます。この場合の式の値は最後の式の値です。
5 + x;        // 特に宣言しなくても変数xの値を参照してます。代入されていない変数の値は0となります。
x = 5; x * 3; // 当然変数に値を代入できます。
x += 5;       // 残念! こういうのは今の時点では出来ないらしい。

もちっと進みますか。

sin(5);
log(15);
M_PI;         // 定数πを示します。これは定数なので代入できません。
M_PI = 3;     // つまりこれはエラーになると。

ちなみに組み込みの定数・関数は以下で公開されてますし、後で追加する方法も用意されてます。
http://expreval.sourceforge.net/exprtmpl.html
ということでさすがに4000行もあるだけに色々出来そうです。libformulaの地位あやうしです。