Parsecは、プログラミング言語Haskellで書かれた、パーサを記述するためのライブラリである。高階パーサコンビネータに基づいており、多くの小さなパーサを組み合わせて複雑なパーサを作成することができる。このライブラリは、Erlang、Elixir、OCaml、Racket、F#や、命令型プログラミング言語であるC#およびJavaなど、他の多くの言語でも再実装されている。

パーサコンビネータベースのプログラムは、一般的にパーサジェネレータベースのプログラムよりも実行速度が遅いため、Parsecは通常、小規模なドメイン固有言語に使用される。一方、Glasgow Haskell Compiler(GHC)のようなコンパイラにはパーサジェネレータベースのHappyが採用されている。

Parsecから派生した他のHaskell用パーサコンビネータライブラリには、MegaparsecやAttoparsecがある。

Parsecは、3条項BSDライセンスの下で公開されているフリーソフトウェアである。

例 Parsecで記述されたパーサーは、特定の文字列を認識するといった単純なパーサから始まり、それらを組み合わせることでより複雑な振る舞いをするパーサを構築する。たとえば、digitは1桁の数字を解析し、stringは特定の文字列("hello"など)を解析する。

Parsecのようなパーサコンビネータライブラリは、パーサを実際の値に対して実行するためのユーティリティ関数を提供している。文字列から単一の数字を認識するパーサは、パーサを作成する関数と、これらのユーティリティ関数の1つ(この場合はparse)を呼び出してパーサを実行するmain関数の2つに分割できる。import Text.Parsec -- 一般的な構文解析のユーティリティ関数を持つ import Text.Parsec.Char -- 特定の基本コンビネータを含む type Parser = Stream s m Char => ParsecT s u m String

parser :: Parser parser = string "hello"

main :: IO () main = print (parse parser "<test>" "hello world") -- 'Right "hello"' を出力するここでは、parserの型シグネチャを読みやすくするためにParser型を定義している。もしこのプログラムを変更して、文字列"hello"または文字列"goodbye"のいずれかを読み取るようにしたい場合は、Alternative型クラスで提供される<|>演算子を使用して、2つのパーサーを組み合わせて両方を試行する単一のパーサーを作成することができる。parser = string "hello" <|> string "goodbye"

脚注

外部リンク

Parsec - HaskellWiki parsec: Monadic parser combinators