Peggy - The Parser Generator for Haskell
Peggyとは
PeggyはHaskell向けのパーザジェネレータです。 シンプルで扱いやすく、表現力のある Parsing expression grammer (PEG) を採用し、効率のよいPackrat parserを生成出来ます。
簡単・強力
Peggyの構文 はとてもシンプルで、すぐに習得できます。 実用的なサーバをすぐに書き始められます。
Parsing Expression Grammer
Peggy は文法としてParsing Expression Grammer (PEG)を採用しています。 PEGには次のような特徴があります。
- CFG (LL(1), LR(1), LALR(1), etc…) にある shift/reduce 競合が存在しない
- シンプルで表現力がある
- 無制限の先読みが可能、パーザとスキャナを分離する必要がない
- 入力長に対して線形時間での解析
PeggyはさらにPEGを拡張しています。
- sepBy拡張構文
- 強力なエラー検出とわかりやすいエラーメッセージの生成
- 左再帰のサポート
モダンな設計
PeggyはモダンなHaskellコードを生成します。
- モナディック
- 高速な配列とハッシュマップの利用
- Template Haskell と Quasiquotation のサポート
- 高速な string-like (ByteString, Text) シーケンスのサポート
- 扱いやすいエラーハンドリング
埋め込み DSL
Peggy はHaskellの embeded DSL (EDSL) として提供されます。 パーザをHaskellのソースコードに直接埋め込むことができます。 これはHaskellのコードを生成し、Haskellの型チェッカによって型検査されます。
{-# Language TemplateHaskell, QuasiQuotes, FlexibleContexts #-} import Text.Peggy [peggy| top :: Double = expr !. expr :: Double = expr "+" fact { $1 + $2 } / expr "-" fact { $1 - $2 } / fact fact :: Double = fact "*" term { $1 * $2 } / fact "/" term { $1 / $2 } / term term :: Double = "(" expr ")" / number number ::: Double = [1-9] [0-9]* { read ($1 : $2) } |] main :: IO () main = print . parseString top "<stdin>" =<< getContents
さあ、はじめよう!
利用を始めるために便利な、いくつかのドキュメントがあります。