{-# OPTIONS -XScopedTypeVariables -XRank2Types #-} {-# LANGUAGE TemplateHaskell #-} module TestDerive where import Text.GRead import Text.GRead.Derive data T1 = T1 :<: T1 | T1 :>: T1 | C1 deriving Show data T2 a = T2 a :+: T2 a | a :*: T2 a | C2 deriving Show data T3 = T3 T4 | C3 deriving Show data T4 = T4 T3 | C4 deriving Show data T5 = T5 T6 | C5 deriving Show data T6 = T6 T7 deriving Show data T7 = T7 T5 deriving Show data T8 = T8 (T2 T8) | C8 deriving Show data T9 = T9 (T2 T10) | C9 deriving Show data T10 = T10 T9 deriving Show data T11 = T11 (T2 T11) (T2 T12) deriving Show data T12 = T12 T11 deriving Show data T13 = T13 deriving Show data T14 a b = T14 a b deriving Show data T15 = T15 :-: T1 | C15 data T16 = T1 :.: T16 | C16 $(deriveGrammar ''T1) $(deriveGrammar ''T2) $(deriveGrammar ''T3) $(deriveGrammar ''T4) $(deriveGrammar ''T5) $(deriveGrammar ''T6) $(deriveGrammar ''T7) $(deriveGrammar ''T8) $(deriveGrammar ''T9) $(deriveGrammar ''T10) $(deriveGrammar ''T11) $(deriveGrammar ''T12) $(deriveGrammar ''T13) $(deriveGrammar ''T14) -- $(deriveGrammar ''T15) -- doesn't work -- $(deriveGrammar ''T16) -- doesn't work data BT a b c d e = BT (BT a b c d e) (BT a b c d e) | O_A a | O_B b | O_C c | O_D d | O_E e | O_movl | O_movw | O_movb | O_movzbw | O_movzbl | O_movzwl | O_movsbw | O_movsbl | O_movswl | O_pushl | O_popl | O_pushfl | O_popfl | O_notl | O_notw | O_notb | O_sall | O_salw | O_salb | O_sarl | O_sarw | O_sarb | O_shrl | O_shrw | O_shrb | O_roll | O_rolw | O_rolb | O_rorl | O_rorw | O_rorb | O_shldl | O_shrdl | O_addl | O_addw | O_addb | O_adcl | O_subl | O_subw | O_subb | O_sbbl | O_imull | O_imulw | O_imulb | O_mull | O_divl | O_divw | O_divb | O_idivl | O_xorl | O_xorw | O_xorb | O_andl | O_andw | O_andb | O_orl | O_orw | O_orb | O_incl | O_incw | O_incb | O_decl | O_decw | O_decb | O_negl | O_negw | O_negb | O_testl | O_testw | O_testb | O_leal | O_cmpl | O_cmpw | O_cmpb | O_cmpsb | O_scasb | O_movsl | O_movsw | O_movsb | O_stosl | O_stosw | O_stosb | O_leave | O_ret | O_call | O_jmp | O_je | O_jne | O_jl | O_jle | O_jg | O_jge | O_js | O_jns | O_jz | O_jnz | O_jc | O_jnc | O_jo | O_jno | O_ja | O_jae | O_jb | O_jbe | O_jp | O_seta | O_setae | O_setb | O_setbe | O_sete | O_setne | O_setl | O_setle | O_setg | O_setge | O_setc | O_setcb | O_btl | O_btsl | O_btrl | O_btcl | O_cld | O_cltd | O_cwtl | O_cbtw | O_rep | O_repz | O_repnz | O_fild | O_fildl | O_fildll | O_fsubp | O_fsubr | O_fsubrp | O_fsubrl | O_fsubrs | O_fsubs | O_fsubl | O_fsub | O_faddp | O_fadds | O_faddl | O_fadd | O_fiaddl | O_fmul | O_fmuls | O_fmull | O_fmulp | O_fimull | O_fdiv | O_fdivp | O_fdivr | O_fdivrs | O_fdivrl | O_fdivrp | O_fidivl | O_fidivrl | O_fdivl | O_fdivs | O_fprem | O_fstp | O_fsts | O_fstps | O_fstl | O_fstpl | O_fstpt | O_fst | O_fistl | O_fistpl | O_fistpll | O_fld | O_flds | O_fldl | O_fldt | O_fldz | O_fld1 | O_fldl2e | O_fldln2 | O_fchs | O_fsin | O_fcos | O_fptan | O_fsqrt | O_fpatan | O_fabs | O_f2xm1 | O_fscale | O_fyl2x | O_fucom | O_fucomp | O_fucompp | O_fcomp | O_fcompp | O_fcoml | O_fcompl | O_ficompl | O_fcoms | O_fcom | O_fcomps | O_fnstsw | O_fnstcw | O_fldcw | O_frndint | O_fxch | O_sahf | O_nop deriving (Show, Eq, Read) $(deriveGrammar ''BT) res = gread "BT O_nop BT (O_B T10 C9) (O_E T14 C1 C3)" :: GReadResult (BT T1 T10 T11 T12 (T14 T1 T3))