2010年04月28日

C#からJScriptのevalを呼び出し「四則演算式」を計算させる

   このエントリーをはてなブックマークに追加 Clip to Evernote
前回の「小町算」の続きです。
SelectManyとString.Formatで得た
"1234 + 5 - 678 * 9"
といった計算式(文字列)を計算させる必要がでてきます。
この結果が 100 ならば、小町算ということになります。

どうやって、プログラムで文字列で表された計算式を解釈し計算させるかですが、
ひとつは、逆ポーランド記法(後置記法)に変換し、スタックを使って計算するコードを書く方法。
でも一から書くとなるとちょっと面倒なので、System.CodeDom?.Compiler.JScriptCodeProviderを使い、 JScriptの式として計算させることにしました。

※ JScriptCodeProviderは、Microsoft.JScript アセンブリを参照に追加することで利用可能になります。

実行速度の面では不利かもしれませんが、JScriptCodeProviderを使ったほうがコードは確実に短くなると思います。

JScriptEvaluatorクラスというものを作り


のように書ければいろんなところで使えそうです。
staticメソッドにしてもいいですが、ここでは通常のインスタンスメソッドとして 実装しました。

このクラスの中では、System.CodeDom.Compiler.JScriptCodeProviderクラスを利用しています。
このJScriptCodeProviderクラスを使うと、JScriptのソースコードを C#側から動的にコンパイル・実行できます。
もちろん、C#から引数を渡して、そのメソッドを呼び出せます。

でも、リフレクション使っての呼び出しなので可読性が悪いです。
C#4.0のdynamic使えばもっと簡単に書けると思います。(試してません...)

ところで、ここでは、JScriptCodeProvider を使いましたが、CSharpCodeProvider を使っても同様のことが行えます。
しかし、C#だと型を意識したコードにしなければならないし、
1/2 は 0となってしまうので、1.0/2.0という式にしなくてはなりません。
JScriptのほうが都合がいいです。

ということで、JScriptEvaluator クラスのソースコードは、こちらに掲載しています。


この記事へのコメント
jsc (JScript コンパイラ)で、DLLを作れば、もっと簡単な気がします。
Posted by BLUEPIXY at 2010年04月28日 21:43
なぜか、トラックバックできなかったので、リンクで。
Posted by BLUEPIXY at 2010年04月28日 21:53
ああ、なるほど、JScript.NETは、.NETの言語なんだから、dllにしちゃえば良いのか。
Posted by Gushwell at 2010年04月28日 22:55
 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/52012439