スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

boost::spirit:任意変数込みの計算式の実行

boost::spiritの恩恵にどっぷりと与っています。
これまでにsin(x*3.1416/2)のような計算式の実行を達成していましたが
xを予めプログラム内で定義する必要がありました。
今回は入力ファイルで任意の変数(名前と値)を定義して
計算式を実行したいと思います。
要するに入力ファイルで変数と式を
angle 0.25
sin(angle*3.1416/2)
といったように定義して計算式の値を得るということです。

要点だけご紹介。
基本的な四則演算ルールに変数を扱えるようにちょっと改造します。

rule<S> expression, term, factor, group, func, variable, alp, sp_char;

definition(const calculator& self)
{
// 構文定義
group = '(' >> expression >> ')';
factor = real_p[&PUSH] | group | func | variable[&PUSH_val];
term = factor >> *( ('*' >> factor)[&MUL] |
             ('/' >> factor)[&DIV] |
             ('^' >> factor)[&POW] );
expression = term >> *( ('+' >> term)[&ADD] | ('-' >> term)[&SUB] );
func = ( str_p("sin") >> group )[&PUSH_SIN];
alp = alpha_p[&PUSH_alp];
sp_char = ch_p('_')[&PUSH_alp];
variable = alp >> * ( alnum_p[&PUSH_alp] | sp_char );

}

これで任意のアルファベットと数字とアンダーバーを
組み合わせた変数が使用可能になります。
ただし頭文字はアルファベットである必要があります。
数字で始まる変数はちょっと無理でしょうか?
たぶん数値と見分けがつかなくなるような気がします。

いやー、boost spiritって本当にすごいですね。

実行結果です。

boost_spirit_test03.jpg

変数:angle_101=0.25
数式:sin(angle_101*3.1416/2*2)+angle_101
で実行した結果です。
変数「angle_101」が認識されているか確認するために
printfしています。(円周率入力し間違えました。恥ずかしい...)
sin()と2項目でしっかりと認識されています。

スポンサーサイト

コメントの投稿

非公開コメント

カレンダー
09 | 2017/10 | 11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
プロフィール

uglab

Author:uglab
ソフト開発会社

【Twitter】
フォローお願いします

【You tube動画一覧】
チャンネル登録お願いします


最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
FC2カウンター
検索フォーム
スポンサードリンク
    【スポンサードリンク】

リンク
RSSリンクの表示
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。