The peggy package

[Tags: bsd3, library]

The Parser Generator for Haskell http://tanakh.github.com/Peggy


[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.3.*), mtl (>=2.0), peggy, template-haskell (>=2.5 && <2.9) [details]
LicenseBSD3
CopyrightCopyright (c)2011, Hideyuki Tanaka
AuthorHideyuki Tanaka
MaintainerHideyuki Tanaka <tanaka.hideyuki@gmail.com>
CategoryLanguage
Home pagehttp://tanakh.github.com/Peggy
Source repositoryhead: git clone git://github.com/tanakh/Peggy.git
Executablespeggy-example
UploadedWed Jan 30 04:52:54 UTC 2013 by HideyukiTanaka
DistributionsNixOS:0.3.2
Downloads1949 total (72 in last 30 days)
Votes
0 []
StatusDocs uploaded by user
Build status unknown [no reports yet]

Modules

[Index]

Flags

NameDescriptionDefaultType
build-exampleDisabledAutomatic

Use -f <flag> to enable a flag, or -f -<flag> to disable that flag. More info

Downloads

Maintainers' corner

For package maintainers and hackage trustees

Readme for peggy-0.3.2

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