ChristmasTree-0.1: examples/TestDerive.hs
{-# 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))