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、使ってみたくなりましたよね?ね?


同じカテゴリのエントリ
1.Lift再入門 / 8.javascriptからsubmitできない / 7.Ajax Form / 6.Radio、Checkboxについて / 5.行列型の編集FORM / 4.サーバーサイドバリデーションとサーバサイド関数 / 3.ログインFORM - S.param使ったら負け / 2.Snippetメソッドとして許される型 / sbt0.12.xで依存jar抽出タスク / scala2.10+lift2.5+NetBeans7.2 / Scalaで入門関数プログラミング / reactive-webを試してみました / Lift2.2M1のテンプレート機能 / Scala Compiler Plugin / View Bound/Context Bound / ScalaZa01参加してきました / Akka Frameworkチュートリアルの次 / Akka Frameworkチュートリアルその2 / Akka Frameworkチュートリアル / LiftでJCaptcha / Url Rewrite Filter / sbt-android-plugin / Android SDK for Scala / 祝Lift2.0リリース / Liftの携帯対応まとめ / Scala2.8への移行 / Lift 2.0-scala280-SNAPSHOT/sbt0.7.1 / Scalaお絵かき環境 - Kojo / Lift+Quartzでバッチ / Scala&Liftを採用した理由 / Liftでdate_select系ヘルパーを作る / LiftでAjax / LiftのSubmitかしこい / lift-mapperのpaginateを使う / snippetをspecする / Lift Mapperを拡張する / LiftのDBをMySQLに / Liftプロジェクト環境を整える / Scala本読み比べてみました / NetBeans6.7&scala / じつはScalaはライトな言語 / Scalaバザ~ル / lift1.0所感 / specsを読む / implicit def / ScalaならNetBeansがサイコー / scala勉強会@東北がスタート / それでも俺はLiftをやるってのか / Scala&Liftセットアップ / ブログリニューアル /
コメント

コメントしてください

closed.