packages feed

ChristmasTree-0.2: 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))