NetBeans6.7&scala

NetBeans Scalaプラグインの新版が出てたので軽く触ってみました。あとついでに、サルでもわかるParser Combinatorの使い方。

以前ScalaやるならNetBeansが最高だぜ的な煽りエントリを書いたあと、まったく進展がなかったNetBeans Scalaプラグイン(オレしょんぼりしてました)。

本家のScala IDE for Eclipseにかなり溝をあけられていましたが、
(↓これEclipse)




先日NetBeans6.7に合わせた新版がリリースされてたので、NetBeans6.7 RC1と組み合わせて使ってみました。
(↓これNetBeans)



軽く触ってみた感じ、Eclipseに比べて、補完・サジェストが賢い動作が軽いデフォルトの色がかわいい。Eclipseに劣っていそうなのは、バンドルされてるScalaが最新じゃない(2.7.3)ことくらいです。

そうです、NetBeansは「必要な唯一のIDEです」。

Parser Combinator

ついでなのですが、最近ようやくわかってきたParser Combinatorの使い方をちょっと紹介。Scalaはライトな言語だと言ったわけですが、Parser Combinatorもその名前からうける壁のようなものがあります。いきなり完成品のパーザーを見ても悶絶するばかり。

しかし実はそんなことなくて、落ち着いて読めば意外と簡単。
基本はこんな風。

  import scala.util.parsing.combinator._

  class SimpleParser extends JavaTokenParsers {
    val what = """\p{InHiragana}+""".r //ひらがなの正規表現
    def diary:Parser[String] =
     what ~ "、しました" ^^ { case w~_ => w }
  }

  object Test extends SimpleParser {
    def main(args:Array[String]) {
      println( parseAll( diary, "はみがき、しました" ) )
    }
  }

実行すると、「parsed: はみがき」と出ます;;
理屈や仕様を考えなくても、構造をみれば、次のように見える。

 def func:Parser[結果オブジェクトの型] =
  文字列にマッチさせたい形 ^^ {
   case 拾いたい部分を拾う => 結果オブジェクト
  }

"~"(チルダ)は区切り、"_"(アンダーバー)は読み捨て、くらいに考えておけば大丈夫。

文字列にマッチさせたい形の書き方は、繰り返しの扱い方などでバリエーションあるので、次のステップは、以下のソースやサイトのマネしてみるといいと思います。

stevej/scala-json - GitHub(Twitterの中の人)
[Scala] How to Use Combinator Parser (1) - Functional Programming Memo(日本語。とっても勉強になる。)
External DSLs made easy with Scala Parser Combinators - Ruminations of a Programmer(英語。External DSLとはなんぞやがわかる)

ざっくり言うと、「入れ子にできる正規表現、マッチした結果を好きなオブジェクトに変換できるしくみ」っていう感じです。


今、SQLのDDL(CREATE文)のパーサーを作ろうとしていますが、例えばScalaにはXMLリテラルがあるので、DDLパースしてXMLに変換、とかいうJavaやORMにありがちな冗長作業も簡単に自動化できるハズ。


NetBeans&Scala、使ってみたくなりましたよね?ね?


コメント

コメントしてください
お名前:
入力しなければ「匿名さん」。20字以内。

メール:
入力しても表示しません

URL:
入力すればリンクが貼れます


コメント: