型なしラムダ式の実装(つづき)
id:kkanda:20040905に書いた型なしラムダ式の実装が一通り完了。
現状では、
static void Example6(ParsingInfo info, LambdaContext ctx) { //ex6. λ.(1 0) λ.0: Γ={b,a} VariableTerm v1 = new VariableTerm(info, 1, 3); VariableTerm v2 = new VariableTerm(info, 0, 3); VariableTerm v3 = new VariableTerm(info, 0, 3); ApplicationTerm app1 = new ApplicationTerm(info, v1, v2); AbstractionTerm abs1 = new AbstractionTerm(info, "x", app1); AbstractionTerm abs2 = new AbstractionTerm(info, "x", v3); ApplicationTerm app2 = new ApplicationTerm(info, abs1, abs2); Lambda.Eval(ctx, app2); }
という感じに、抽象構文木を手書きで書けば動く。
実行結果は、こんな感じ。
Eval: (lambda x. b x) lambda x. x Eval: -> b lambda x. x [Apply E-AppAbs] Eval: -> NoRuleApplies
Benjamin C. Pierce先生の本に書いてある内容をC#で実装しただけなのだが、
なんかプログラミングっぽい動きをするので面白かった。
ただ、このまま抽象構文木を手書きでやってくのもつらいと思い、
parserとscannerを作るか悩ましい。
C#のコードを吐いてくれる良いparser generatorがあればさくっと使ってしまおうと
思い、googleで探してみたのだが私のへっぽこな検索技術で見つかったのはこれだけ。
- COCO/R http://www.ssw.uni-linz.ac.at/Research/Projects/Coco/
- GOLD Parser http://www.devincook.com/goldparser/
COCO/Rは、GPLなので却下。しかも、使いづらそう。。。
GOLD Parserは良さそうだったのでインストールしみたが、起動せずorz
う〜む、COCO/Rを使うか他を探すか、Parserを手書きするか、かなり悩む。。。
λ式の文法を試しに書き出してみたところそんなに難しくないので、
Parserを手で書くのが簡単なんだよなと思うものの、
これから言語拡張したら手で書くのがつらくなるだろうとも思うし、
あ〜、本気で悩むorz