packages feed

distributors-0.4.0.0: test/Examples/Chain.hs

module Examples.Chain
  ( Chain (..)
  , chainGrammar
  , chainExamples
  ) where

import Control.Applicative
import Control.Lens
import Control.Lens.Grammar

data Chain
  = Emp
  | Char Char
  | Seq Chain Chain
  deriving stock (Eq, Ord, Show, Read)

makePrisms ''Chain

chainGrammar :: CtxGrammar Char Chain
chainGrammar = ruleRec "chain" seqG
  where
    seqG chn = rule "seq" $
      chain Left _Seq _Emp noSep (atomG chn)
    atomG chn = rule "atom" $
      _Char >? charG <|> terminal "(" >* chn *< terminal ")"
    charG = notOneOf "()\\"
      <|> terminal "\\" >* oneOf "()\\"

chainExamples :: [(Chain, String)]
chainExamples =
  [ (Char 'x', "x")
  , (Seq (Char '1') (Char '2'), "12")
  , (Seq (Seq (Char 'x') (Char 'y')) (Char 'z'), "xyz")
  , (Seq (Char 'x') (Seq (Char 'y') (Char 'z')), "x(yz)")
  , (Emp, "")
  ]