最新の FsYacc/lex 環境で chulang を作成するときのメモ

勢いで作り始めた 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 を書き換える

http://github.com/fsprojects/FsLexYacc/blob/master/tests/TestProjectUsingNugetPackage/TestProjectUsingNugetPackage.fsproj#L86

を参考にして、Lexer.fsl と Parser.fsy を追加します。

  <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 をインポートします。

  <Import Project="..\packages\FsLexYacc.6.0.3\bin\FsLexYacc.targets" />

FsLexYacc.targets の呼び出しにバージョンが付いてしまっているので、Nuget が最新になると呼び出せない…という不具合はあるのですが、まあ、こうしておきます。*.fsproj に FsLexYacc.targets をコピーして動かすと、Build.dll がない状態になるので、仕方がないですね。

以前は、ビルド時に

"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 とは?

絵文字で書く関数型プログラム言語です。何処を目指しているかは謎です(いや、実ははっきりしてるんだけど、いまのところは「謎」)。たぶん、タブレットとかスマートフォンで打ちやすい言語になるはずです。

http://chu-lang.com/

こんな感じで動く予定。

カテゴリー: F#, chu パーマリンク

最新の FsYacc/lex 環境で chulang を作成するときのメモ への1件のコメント

  1. ピンバック: F# Weekly #35, 2014 | Sergey Tihon's Blog

コメントは停止中です。