-- Haskel data types for the abstract syntax. -- Generated by the BNF converter. {-# LANGUAGE GeneralizedNewtypeDeriving #-} -- | The abstract syntax of language Core. module AbsCore where import qualified Prelude as T (Char, Double, Integer, String) import qualified Prelude as C (Eq, Ord, Show, Read) import Data.String data Module = Module Ident [Tdef] [Vdefg] -- ^ Module ::= "%module" Ident Tdef Vdefg deriving (C.Eq, C.Ord, C.Show, C.Read) data Tdef = Data QualIdent [Tbind] [Cdef] -- ^ Tdef ::= "%data" QualIdent Tbind "=" "{" Cdef "}" | Newtype QualIdent [Tbind] MaybeTy -- ^ Tdef ::= "%newtype" QualIdent Tbind MaybeTy deriving (C.Eq, C.Ord, C.Show, C.Read) data MaybeTy = JustTy Ty -- ^ MaybeTy ::= "=" Ty | NoTy -- ^ MaybeTy ::= deriving (C.Eq, C.Ord, C.Show, C.Read) data Cdef = Constr QualIdent [ATbind] [Tyt] -- ^ Cdef ::= QualIdent ATbind Tyt deriving (C.Eq, C.Ord, C.Show, C.Read) data Tyt = TT Ty -- ^ Tyt ::= Ty2 deriving (C.Eq, C.Ord, C.Show, C.Read) data Vdefg = Nonrec Vdef -- ^ Vdefg ::= Vdef | Rec [Vdef] -- ^ Vdefg ::= "%rec" "{" Vdef "}" deriving (C.Eq, C.Ord, C.Show, C.Read) data Vdef = VdefQ QualIdent Ty Exp -- ^ Vdef ::= QualIdent "::" Ty "=" Exp | VdefU Ident Ty Exp -- ^ Vdef ::= Ident "::" Ty "=" Exp deriving (C.Eq, C.Ord, C.Show, C.Read) data Exp = App Exp Exp -- ^ Exp ::= Exp1 Exp2 | Appt Exp Ty -- ^ Exp ::= Exp1 "@" Ty2 | Case Exp Vbind [Alt] -- ^ Exp ::= "%case" Exp2 "%of" Vbind "{" Alt "}" | Coerce Ty Exp -- ^ Exp ::= "%coerce" Ty2 Exp | Dcon QualIdent -- ^ Exp ::= QualIdent | External T.String Ty -- ^ Exp ::= "%external" String Ty | Lams [Bind] Exp -- ^ Exp ::= "\\" Bind "->" Exp | Let Vdefg Exp -- ^ Exp ::= "%let" Vdefg "%in" Exp | Litc Lit -- ^ Exp ::= Lit | Note T.String Exp -- ^ Exp ::= "%note" String Exp | Var Ident -- ^ Exp ::= Ident deriving (C.Eq, C.Ord, C.Show, C.Read) data Bind = Tb Tbind -- ^ Bind ::= "@" Tbind | Vb Vbind -- ^ Bind ::= Vbind deriving (C.Eq, C.Ord, C.Show, C.Read) data Alt = Acon QualIdent [ATbind] [Vbind] Exp -- ^ Alt ::= QualIdent ATbind Vbind "->" Exp | Adefault Exp -- ^ Alt ::= "%_" "->" Exp | Alit Lit Exp -- ^ Alt ::= Lit "->" Exp deriving (C.Eq, C.Ord, C.Show, C.Read) data Vbind = Vbind Ident Ty -- ^ Vbind ::= "(" Ident "::" Ty ")" deriving (C.Eq, C.Ord, C.Show, C.Read) data Tbind = TbindLift Ident -- ^ Tbind ::= Ident | TbindPair Ident Kind -- ^ Tbind ::= "(" Ident "::" Kind1 ")" deriving (C.Eq, C.Ord, C.Show, C.Read) data ATbind = ATbind Tbind -- ^ ATbind ::= "@" Tbind deriving (C.Eq, C.Ord, C.Show, C.Read) data Ty = TArrow Ty Ty -- ^ Ty ::= Ty1 "->" Ty | Tapp Ty Ty -- ^ Ty ::= Ty1 Ty2 | Tcon QualIdent -- ^ Ty ::= QualIdent | Tforalls [Tbind] Ty -- ^ Ty ::= "%forall" Tbind "." Ty | Tvar Ident -- ^ Ty ::= Ident deriving (C.Eq, C.Ord, C.Show, C.Read) data Kind = Karrow Kind Kind -- ^ Kind ::= Kind1 "->" Kind | Klifted -- ^ Kind ::= "*" | Kopen -- ^ Kind ::= "?" | Kunlifted -- ^ Kind ::= "#" deriving (C.Eq, C.Ord, C.Show, C.Read) data Lit = Lchar T.Char Ty -- ^ Lit ::= "(" Char "::" Ty2 ")" | Lint T.Integer Ty -- ^ Lit ::= "(" Integer "::" Ty2 ")" | Lrational T.Double Ty -- ^ Lit ::= "(" Double "::" Ty2 ")" | Lstring T.String Ty -- ^ Lit ::= "(" String "::" Ty2 ")" deriving (C.Eq, C.Ord, C.Show, C.Read) data QualIdent = Qual Ident Ident -- ^ QualIdent ::= Ident "." Ident deriving (C.Eq, C.Ord, C.Show, C.Read) newtype Ident = Ident T.String deriving (C.Eq, C.Ord, C.Show, C.Read, Data.String.IsString)