{-# 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