勢いで作り始めた chu-lang.com ですが、ちまちまと lex/yacc のパターンで書き直し。どうせならば、F# の FsLex/FsYacc で作ろうかと思ってやっているのですが、結構はまります。
F#のfslexとfsyaccを用いたコンパイラ作成 (2/4):CodeZine
http://codezine.jp/article/detail/5355?p=2
fslexとfsyaccを使って字句・構文解析して電卓っぽい計算をしてくれる奴を作成したい – My Life as a Mock Quant
http://d.hatena.ne.jp/teramonagi/20120506/1336290544
VS2013でFsYacc、FsLexを使う – komorebikoboshiのブログ
http://komorebikoboshi.hatenablog.com/entry/2014/05/23/225132
もともと私の手元には Powerpack-4.0.0.0 が入っていて、少し事情が違うのですが、だいたい環境は同じです。なんか、lex/yacc の実行ファイルから Visual Studio から自動でビルドできるところまで、追っていました。が、*.targets の設定がうまく動かないのか?(F# 3.0 の環境だと動くのか?)、妙に環境が整えづらいんですよね。FsLex のビルドも遅いし…と、再び探すと。
FsLex, FsYacc
http://fsprojects.github.io/FsLexYacc/
最新版は、Nuget から取って来る、という状態になっているようです。github から取って来れば、サンプルコードとサンプルプロジェクトがついてきて、最新の fslex.exe と fsyacc.exe が packages の中にダウンロードされます。便利ですね。
■Nuget から FsLexYacc を取ってくる
lex/yacc 用の DLL は、FsLexYacc.Runtime という名前に代わっています。
Lexer.fsl と Parser.fsy を使ってビルドするプロジェクトは、上のほうを選択します。実際に使うときは、Runtime だけのプロジェクトで Ok ですね。
■ビルドされるように *.fsproj を書き換える
を参考にして、Lexer.fsl と Parser.fsy を追加します。
1 2 3 4 5 6 7 8 9 10 | < ItemGroup > < None Include = "Lexer.fsl" /> < None Include = "Parser.fsy" /> < FsYacc Include = "Parser.fsy" > < OtherFlags >--module Parser</ OtherFlags > </ FsYacc > < FsLex Include = "Lexer.fsl" > < OtherFlags >--unicode</ OtherFlags > </ FsLex > </ ItemGroup > |
あと FsYacc と FsLex が有効になるように *.targets をインポートします。
1 | <Import Project= "..\packages\FsLexYacc.6.0.3\bin\FsLexYacc.targets" /> |
FsLexYacc.targets の呼び出しにバージョンが付いてしまっているので、Nuget が最新になると呼び出せない…という不具合はあるのですが、まあ、こうしておきます。*.fsproj に FsLexYacc.targets をコピーして動かすと、Build.dll がない状態になるので、仕方がないですね。
以前は、ビルド時に
1 2 | "C:\Program Files (x86)\FSharpPowerPack-4.0.0.0\\bin\fslex.exe" "$(ProjectDir)\Lexer.fsl" --unicode "C:\Program Files (x86)\FSharpPowerPack-4.0.0.0\\bin\fsyacc.exe" "$(ProjectDir)\Parser.fsy" --module Parser |
なことをやって、毎回ビルドしていたのですが、これでファイルが更新されたときにビルドされるようになります。
■PCLで動くのか?
結論から言うと、FsLexYacc.Rutime は PCL では動きません。ちなみに Powerpack 版も動かなかったので同じ状態です。
ただし、これはソースが github で公開されているので、Profile78 あたりでビルドし直してやれば、Xamarin.iOS/Android で動くようになるのでは?と思っています。あと Windows Store アプリのほうも。
■chu-lang とは?
絵文字で書く関数型プログラム言語です。何処を目指しているかは謎です(いや、実ははっきりしてるんだけど、いまのところは「謎」)。たぶん、タブレットとかスマートフォンで打ちやすい言語になるはずです。
こんな感じで動く予定。
ピンバック: F# Weekly #35, 2014 | Sergey Tihon's Blog