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