Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

The Parser Generator for Haskell

branch: master
Octocat-spinner-32 Text fix for 7.4.1 February 14, 2012
Octocat-spinner-32 attic Language => LANGUAGE October 07, 2011
Octocat-spinner-32 bootstrap Language => LANGUAGE October 07, 2011
Octocat-spinner-32 example fix for 7.4.1 February 14, 2012
Octocat-spinner-32 .gitignore prototype September 07, 2011
Octocat-spinner-32 LICENSE prototype September 07, 2011
Octocat-spinner-32 README.md fix readme December 05, 2011
Octocat-spinner-32 Setup.hs prototype September 07, 2011
Octocat-spinner-32 peggy.cabal relax version upperbound and version bump January 30, 2013
README.md

Peggy: A Parser Generator of Parsing Expression Grammer (PEG)

About

This is an yet another parser generator of Parsing Expression Grammer (PEG) which is:

  • Simple
  • Concise
  • Fast
  • Modern

Usage

You can find a recent stable release in Hackage DB. You can install this as following instruction:

$ cabal update
$ cabal install Peggy

Why should you use Peggy?

Haskell has commonly used parser generators, one of them are Alex/Happy. But I think Alex/Happy are not good in these points:

  • Generates regacy codes

Alex uses only too basic libraries. It does not use monad-transformers, iteratee, ListLike, Text, and so on.

  • Tradisional Regexp/CFG based parser

Parsec has no good error recovery.

unnun, kannun...

...

Quick Start

Here is an example of parsing arithmetic expressions.

{-# QuasiQuotes #-}
{-# Language FlexibleContexts #-}

import Text.Peggy

[peggy|
exp :: Double
  = exp "+" fact  { $1 + $2 }
  / exp "-" fact  { $1 - $2 }
  / fact
fact :: Double
  = fact "*" term { $1 * $2 }
  / fact "/" term { $1 / $2 }
  / term
term :: Double
  = "(" exp ")"
  / number
number ::: Double
  = ([1-9][0-9]*) { read $1 }
|]

main :: IO ()
main =
  print . parse exp =<< getContents
Something went wrong with that request. Please try again.