The peggy package

[Tags: bsd3, library]

The Parser Generator for Haskell


[Skip to ReadMe]

Properties

Versions0.1.0, 0.1.1, 0.1.2, 0.1.3, 0.2.0, 0.2.0.1, 0.2.1, 0.3.0, 0.3.1, 0.3.1.1, 0.3.2
Change logNone available
Dependenciesbase (==4.*), hashtables (==1.0.*), haskell-src-meta (==0.5.*), ListLike (==3.1.*), monad-control (==0.2.*), mtl (==2.0.*), parsec (==3.1.*), template-haskell (>=2.5 && <2.7) [details]
LicenseBSD3
CopyrightCopyright (c)2011, Hideyuki Tanaka
AuthorHideyuki Tanaka
MaintainerHideyuki Tanaka <tanaka.hideyuki@gmail.com>
CategoryLanguage
Home pagehttp://github.com/tanakh/peggy
Source repositoryhead: git clone git://github.com/tanakh/Peggy.git
Executablespeggy
UploadedSun Sep 25 05:02:57 UTC 2011 by HideyukiTanaka
DistributionsNixOS:0.3.2
Downloads1949 total (72 in last 30 days)
Votes
0 []
StatusDocs not available [build log]
All reported builds failed as of 2015-06-06 [all 1 reports]

Modules

Downloads

Maintainers' corner

For package maintainers and hackage trustees

Readme for peggy-0.1.3

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

About

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

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:

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

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

...