packages feed

ptera-th-0.1.0.0: README.md

# Ptera: A Generator for Parsers

[![Hackage](https://img.shields.io/hackage/v/ptera.svg)](https://hackage.haskell.org/package/ptera)

## Installation

Add dependencies on `package.cabal`:

```
build-depends:
    base,
    bytestring,
    ptera,          -- main
    ptera-th,       -- for outputing parser with Template Haskell
    charset,
    template-haskell,
```

## Usage

Write parser rules:

```haskell
data Terminal
    = Digit
    | SymPlus
    | SymMulti
    deriving (Eq, Show, Enum)

data NonTerminal
    | Expr
    | Sum
    | Product
    | Value
    deriving (Eq, Show, Enum)

type ParseRule = Rule Terminal NonTerminal


data Ast
    = GenValue
    | GenSum (NonEmpty Ast)
    | GenProduct Ast Ast

rExpr :: ParseRule Ast
rExpr = rule Expr rSum

rSum :: ParseRule Ast
rSum = rule Sum do
    (rProduct <,> manyP do token SymPlus *> rProduct) <&> \(e, es) -> GenSum do e :| es

rProduct :: ParseRule Ast
rProduct = rule Product do
    orP
        [
            (rValue <* token SymMulti <,> rProduct) <&> \(e1, e2) -> GenProduct e1 e2,
            rValue
        ]

rValue :: ParseRule Ast
rValue = rule Value do token Digit *> pure GenValue
```

## Examples

* Small language: https://github.com/mizunashi-mana/ptera/tree/master/example/small-lang
* Haskell2010: https://github.com/mizunashi-mana/ptera/tree/master/example/haskell2010