packages feed

ChristmasTree-0.1: examples/Test2.hs

{-# OPTIONS  -XScopedTypeVariables -XRankNTypes #-}
{-# LANGUAGE TemplateHaskell #-}

module Test2 where

import Text.GRead
import Text.GRead.Derive

infixl 5 :<:, :+:
infixr 6 :>:, :*:

data T1  =  T1 :<: T1
         |  T1 :>: T1
         |  C1
         deriving (Read, Show)

data T2 a  =  T2 a  :+: T2 a
           |  a     :*: T2 a
           |  C2
         deriving (Read, Show)

data T3 = T3 T4 | C3
         deriving (Read, Show)
data T4 = T4 T3 | C4
         deriving (Read, Show)

$(deriveGrammar ''T1)
$(deriveGrammar ''T2)
$(deriveGrammar ''T3)
$(deriveGrammar ''T4)

read' :: (Gram a) => String -> a
read' input = case gread input of
                 Ok  a       -> a
                 Rep _ (m:_) -> error $ show m

v1 = read' "C1 :>: C1 :>: C1" :: T1
v2 = read' "C1 :<: C1 :<: C1" :: T1
v3 = read' "C1 :>: C1 :<: C1 :>: C1" :: T1
v4 = read' "(((((((((((((C1)))))))))))))" :: T1
v5 = read' "(C1 :>: C1) :*: C2 :+: C2" :: T2 T1
v6 = read' "T3 T4 T3 T4 C3" :: T3
v7 = read' "T4 T3 T4 T3 T4 C3" :: T4
v8 = read' "bla" :: T1 -- error