Compartir a través de


はじめての “Oslo” – Tech Days 2009 でのサンプルと解説 - Part III

先週にこの連続投稿を書きつつ、その間に、”Oslo” DSK January CTP もリリースされたりしたわけですが、読み返してみるとちょっとおかしなことになっていることに気がつきました。それは、

  • Tech Days 2009 でのサンプル・・・いや、違うものを使っているし
  • 解説・・・いや、解説してないや。言語仕様などはね

ということで、看板に偽りありですが(^^;;; このまま続けていくことにしましょう!!

前回までで、モデルの定義を行うことができました。今回は、新しい Textual DSL を作成してみましょう。そこで "M" の MGrammar がでてまいります。MGrammar を用いることで、任意の DSL の構文解析を行うことだできます。驚くことに、この記述がこれまた敷居が低いのです!

ちょっと覚えてしまえば、結構簡単に構文解析を行うことができます。

ここで使うのも Intellipad です(今回から January 2009 CTP を使いますね)。

image

今回の CTP から Mode 変更などがマウスクリックでできるようになりました。前のはどうだったかというと、Minibuffer にて SetMode() するか、ショートカットキー使って(Ctrl + Shif + G とか)でした。

さてそれでは、早速 MGrammar です!次のように書いてみましょう(ここはさすがにちょっと長めなので、サンプルコードをダウンロードし、ファイル[MusicLibraryLanguage.ms]を開いた方がいいです)。

image

拡張子が .mg なファイルを開けば、MGrammar Mode に変わります。手動にて変更したい場合は、Ctrl + Shif + G でさくっと変更できます。

さて、ここは、少し中身みてきましょうか?

language MusicLibraryLanguage
{
        syntax Main = s:Statement+
            => MusicLibrary { valuesof(s) };
}

これが、大枠の枠組みになっています。何かというと、MusicLibraryLanguage という新しい言語(=DSL)のです。 syntax Main にて この新しい DSL を表現しており、そこからアウトプットとして、 => 以下のものを出力してくれています。ここでは、MusicLibrary { … } ですね。この表記は、どこかで見たことがありますよね? MusicLibrary{} 前回 MyMusic.m というものを作ってみましたが、それと同様の書式になっています。

ということは、この MusicLibraryLanguage という DSL を用いると MusicLibrary のモデルを記述していくことができることがわかりますね。

さてさて、さらにドリルダウンしてみましょうか。

syntax Main = s:Statement+ とかいてありますね。これは、Statement の一つ以上の集合を表しています。これに s という名前をつけているのです、で、MusictLibrary { valueof(s) } というアウトプットと照らし合わせると意味がわかると思いますが、ひとつ以上のStatement の内容を出力していることになります。

では、Statement とは何か・・・?というと、その下の行に書いてありますね。

syntax Statement =
            album:TextLiteral BY artist:TextLiteral IS rating:Rating ('.' | '!')
            => { Album {album}, Artist {artist}, Rating {rating} };

Stamement とは、album BY artist IS rating. といった感じの構文ですよと定義されています。そしてこれらをアウトプットとして、{Album {…}, Artist {…}, Rating {…}} という風に出力するわけです。

もうなんとなくわかってきますよね?

次に、album:TextLiteral, artist:TextLiteral に注目してください。この構文はまだまだ先があるようです。。。そこで、TextLiteral の構文を見てみましょう。

nest syntax TextLiteral
            = '"'tx:TextString'"' => tx;
token TextString
            = Character+;
token Character
            = ^(
                '"'
                | '\u005C' // Backslash
                | '\u000A' // New Line
                | '\u000D' // Carriage Return
                | '\u0085' // Next Line
                | '\u2028' // Line Separator
                | '\u2029' // Paragraph Separator
            );

TextLiteral は、 ダブルクォーテーションに囲まれた文字列を示しているというのがわかります。正確には、ダブルクォーテーションを取り除いたものとしているわけです。

文字列をどう定義しているかというと、TextString としています。TextString は、Character+ なので、Character の集合というわけです。で、Character はというとダブルクォーテーションや改行などを除いたユニコードの文字全部ということになります。token を用いて字句解析を行うことも可能なのです。

ちなみに、今回、Character がちょっと複雑になっていますが、これはユニコード文字を受け入れたかったからです。アルファベットと数字だけなら、

token AlphaNum = 'A' .. 'Z' | 'a' .. 'z' | '0' .. '9';

という書き方の方がスマートですね。

さて、tolen ですが、こちらの方がイメージしやすいと思います。

token BY = "by" | "By" | "BY" | "bY";
token IS = "is" | "Is" | "IS" | "iS";

そうです、Statement ででてきた BY と IS は、ここで定義していました。

もうひとつ token を使っているところがありますね。今後はそこを見ていきましょう。

token Rating1 = "terrible" | "awful";
token Rating2 = "so so";
token Rating3 = "awesome";

syntax Rating =
            Rating1 => 1 |
            Rating2 => 2 |
            Rating3 => 3;

はい。ここでは、”terrible” とか、”awesome” などを判別しています。そして syntax 以下を見てください。Rating1 だったら、1、Rating2 だったら、2、Rating3 だったら 3 と変換しているわけです。これらはどこで使われているかというと.. Statement の Rating のところですね。

では、そろそろ、DSL を解釈させてみましょうか?

MGrammar Mode | Tree Preview をクリックしてみてください。するとファイルダイアログがでてきますので、ダウンロードしたファイルの中に、MoreMusic.music というファイルがありますので、それを選択してください。

すると以下のようになります(要するに構文エラーになってます)。

image

これはもちろん、わざとですが、何が問題かわかりますよね?great というのはこの言語では理解できないのです。なので、先ほどの .mg を少し変えてあげましょう。

token Rating3 = "awesome" | "great";

これでこの DSL を解析することができました。

image

Tech Days では、さらに悪乗りして、日本語ちっくな DSL を構文解析してご覧いただきましたが、DSL = 自然言語 ではありませんので、くれぐれもご注意ください!!

DSL ですので、その問題やテーマに最適な言語を用いることがよいのであって、英語や日本語で書くことがよいわけではありません(自然言語の方が好まれるものもあると思いますが、自然言語の全構文を理解する MGrammar なんてあまり意味がありません)。

ここでご理解いただきたいとのは、今まで大変だった DSL の定義をこれだけ簡単に行うことができるということです。 DSL の課題としては、DSL の作成コストがその一つとしてあげられることがありますが、”M” の出現により、モデルと DSL の定義がより簡単に、身近になるところがすばらしいと感じます。

さて、”M” でのサンプル デモという感じで進めてきましたが、”M” が面白いでどうか終わらないで頂ければと思います。モデルは作って終わりでも、書いて終わりでもありません。使って、使われて、使いこなしてなんぼです。なんのためにモデルが必要か、モデリングが必要となっているのかをどうか見失わないでください。

ということで、今回で一区切りしておきます。
<追記>すっかり忘れていましたが、そういえば、コマンドラインつかってどう解析してくれるのか解説していませんでした(^^;

それに "M" は実は・・・というのも書こうとおもって忘れていました。ということで、今回で終わりではなく、もう一回だけ投稿します(Part IV を書きます)。明日以降となりますが、どうかお付き合いくださいませ。</追記>

Tech Days では、そのほかにも "MService" のデモンストレーションも行いましたが、これは皆さんでまだお試しいただくことができないので、解説は省きます。MWindow については、すでにサンプルコードとしてダウンロードいただけますので、どうかダウンロードして中身をみてみてください(Visual Studio 2008 が必要です)。

ながさわ

Comments

  • Anonymous
    February 01, 2009
    こんにちは。 「Microsoft "Oslo" SDK - January 2009 CTP」がリリースされたようです。 セッションでスライドでご紹介した WF - Oslo が含まれているかどうかは未だ見ていませんが、Oslo

  • Anonymous
    February 02, 2009
    はじめての “Oslo” – Tech Days 2009 でのサンプルと解説 - Part I はじめての “Oslo” – Tech Days 2009 でのサンプルと解説 - Part II はじめての

  • Anonymous
    February 09, 2009
    必要な環境: Visual Studio 2008 SP1 “Oslo” SDK January 2009 CTP (SQL Server 2008) “Oslo” SDK をインストールする際のオプションに、Visual