人気ブログランキング | 話題のタグを見る

Parsec パーサコンビネータの意味

Parsec はパーサコンビネータだ。それでは、パーサコンビネータとは何かということになるが、どうも基本的なパーサの関数を組み合わせて複雑なパーサを作り上げる仕組みらしい。Hugs のプロンプトから Parsec を load して、いろいろ試してみた。

Main> :l Text.ParserCombinators.Parsec
Text.ParserCombinators.Parsec>

次の例のように、char 'a' というパーサ関数は 'a' 一文字にマッチするが、

Text.ParserCombinators.Parsec> parse (char 'a') "" "aaabc"
Right 'a'

これに many1 関数を加えると 'a' の繰り返しにマッチする。

Text.ParserCombinators.Parsec> parse (many1 (char 'a')) "" "aaabc"
Right "aaa"

また、string "hi" というパーサ関数は、"hi" という文字列にマッチするが、

Text.ParserCombinators.Parsec> parse (string "hi") "" "hihihi"
Right "hi"

これに、many 関数を組み合わせると、"hi" の繰り返しにマッチしそれを配列として戻す。

Text.ParserCombinators.Parsec> parse (many (string "hi")) "" "hihihi"
Right ["hi","hi","hi"]

このほかにも、基本的なパーサ関数や、それらを組み合わせるための高階関数が Parsec には揃っているようだ。それらを組み合わせることで BNF 記法で表すような複雑なパーサも簡単に作ることができるらしい。Parsec の使い方のようなものが見えてきたが、残念なのはドキュメントがないことだ。Haskell も日本語の本がもっと出てくれば爆発的に流行するような気がする。
by tnomura9 | 2009-09-27 22:40 | Haskell | Comments(0)
<< Parsec - run Simple, simple ... >>