ちょっと、奥さん聞いてよ。
JParsec – NParsec Tutorial
の一番上の downloaded here でとったソースと、一番したのフルコード
The final parser code is as following: …をべたっと cs ファイルに張り付けて
Binary, Unary, Grammar の double を System.Linq.Expressions.Expressionにする。
plus の delegate ( double a,double b ){ return a+b; } を Expression.Add に…それぞれ Expression のビルダ関数にマップする。
Grammar p_number = Terms.OnDecimal<double> を Terms.OnDecimal<Expression>にして、 return Expression.Constant( double.Parse(s) ); にする。
それを
[TestMethod]
public void TestMethod1()
{
var calculator = new Calculator();
var exp = Parsers.RunParser(“10+20”, calculator.Parser, “test”);
var lambda = System.Linq.Expressions.Expression.Lambda(exp);
var result = lambda.Compile().DynamicInvoke();
Console.WriteLine(result);
Assert.AreEqual((double)30,result );
}
でドライブすると Success!
やったねってことで、ちゃんとパースして、コンパイルして実行するって事ができたわけ。
ソースはこちら
でねでね、 Excel なんですよ。
どこの会社でもある事だと思うんだけど、日本語ベースで色々ゴニョゴニョお客とネゴされてきて、エンジニアからすると「で、いったいどんな式?」って聞き返す。Excel開いて、セルに数値入れて式設定して結果見ると何だか非常識な値になってたり、DB定義と突き合わせると明らかに式で見なきゃいけない物を見てなかったり、それを組み入れるとお客との折衝内容と食い違っちゃうトカトカで突き返すと「確認してきます」そして毎回言葉尻はちろっと変わるんだけど、結局いつまでも決まらない罠にはまる。
最後には「Excel シートを渡して、式設定して返して」って言ってそれが帰ってきてから「やっと俺が仕事できる」的な状況。
そんな事って普通ですよね。
んで、「俺が仕事できる」時に「仕事したくないでゴザル」モードだったり、Excelとコピペを繰り返す事に「お刺身にタンポポ(ry」な気がして「俺はこんなことをする為にこの職業を選んだんだっけ…」って思うじゃないですか。
おまけに常時「仕事したくないでゴザル」だったりする奴や、ちっとDB使わせると「SQLとかよくわからなくて」(お前、それ半年前にも言ってなかったか、進歩してないのね…)だって感じで( to be continue…)
あぁ、Excelですよ。
Open XML SDK 2.0 for Microsoft Office
こいつで、Excel ファイルを開くことができて、ブック、シート、セルの順で中身に下りて行って CellFormula プロパティ にたどり着けば、セルに指定された式にたどり着くわけです。
やったね!ってわけで、この CellFormula を NParsec でパースして、式木相当のオブジェクトを構築して、それを元に T4 でコード生成すれば Excel の Cell 相当のプロパティを持って、設定した計算式での計算処理を持ったクラスができちゃうわけですね。
これで「仕事したくないでゴザル」に「特に仕事は無いでゴザル」って言えるじゃん。
顧客との折衝担当が Excel ファイル持ってきたら「やっと決まったのかね」とか上から的にいって「ぽちっとな」すれば良いわけですね。
素晴らしい生産性の向上!これで中々決まらなくても大丈夫だね。
いいか、「まだ決めなくても大丈夫と言ってる間は絶対に決まらないんだ、結果として最後に決まった事に矛盾が出た場合に解決する余裕まですべて食いつぶされるんだ」。
ま、そんなわけで、こんなもんが有ると良いねという題材なので作っております。& NParsec関係は情報少ないっていうか皆無な感じなんで実際の作成時にTDDする方法とか色々絡めて連載しようかねーってことでタイトルの(1)がついております。