packages feed

pec-0.2.0: Language/Pds/Abs.hs

{-# LANGUAGE DeriveDataTypeable #-}
module Language.Pds.Abs where
import Control.DeepSeq
import Data.Generics
import Grm.Prims
import Grm.Lex
import Text.PrettyPrint.Leijen
myLexemes = ["(",")",",","->","::",";","=","=>","VoidT","\\","as","enum","export","import","in","instance","let","module","newtype","of","record","switch","synonym","tagged","type","unit","{","|","}"]
grmLexFilePath = lexFilePath myLexemes
grmLexContents = lexContents myLexemes
data Module 
  = Module  Uident ExportDList ImportDList TypeDList InstDList VarDList
  deriving (Show,Eq,Ord,Data,Typeable)
data ExportD 
  = TypeEx  Uident
  | VarEx  Lident
  deriving (Show,Eq,Ord,Data,Typeable)
data ImportD 
  = ImportD  Uident AsSpec
  deriving (Show,Eq,Ord,Data,Typeable)
data AsSpec 
  = AsAS  Uident
  | EmptyAS 
  deriving (Show,Eq,Ord,Data,Typeable)
data TypeD 
  = TypeD  Uident VarList TyDecl
  deriving (Show,Eq,Ord,Data,Typeable)
data VarD 
  = VarD  Lident DeclSym Exp
  deriving (Show,Eq,Ord,Data,Typeable)
data InstD 
  = InstD  Uident Type
  deriving (Show,Eq,Ord,Data,Typeable)
data DeclSym 
  = Macro 
  | Define 
  deriving (Show,Eq,Ord,Data,Typeable)
data TyDecl 
  = TyRecord  FieldTList
  | TyTagged  ConCList
  | TyEnum  EnumCList
  | TySyn  Type
  | TyNewtype  Uident Type
  | TyUnit  Uident
  deriving (Show,Eq,Ord,Data,Typeable)
data Exp 
  = LetE  Lident DeclSym Exp Exp
  | LamE  Lident Exp
  | SwitchE  Exp Default SwitchAltList
  | AppE  Exp Exp
  | AscribeE  Exp Type
  | VarE  Lident
  | LitE  Lit
  deriving (Show,Eq,Ord,Data,Typeable)
data Default 
  = DefaultNone 
  | DefaultSome  Exp
  deriving (Show,Eq,Ord,Data,Typeable)
data Lit 
  = CharL  Char
  | StringL  String
  | NmbrL  Number
  deriving (Show,Eq,Ord,Data,Typeable)
data Type 
  = TyCxt  CxtList Type
  | TyFun  Type Type
  | TyVoid 
  | TyConstr  Uident TypeList
  | TyVarT  Lident
  deriving (Show,Eq,Ord,Data,Typeable)
data SwitchAlt 
  = SwitchAlt  Exp Exp
  deriving (Show,Eq,Ord,Data,Typeable)
data Cxt 
  = Cxt  Uident VarList
  deriving (Show,Eq,Ord,Data,Typeable)
data ConC 
  = ConC  Uident Type
  deriving (Show,Eq,Ord,Data,Typeable)
data EnumC 
  = EnumC  Uident
  deriving (Show,Eq,Ord,Data,Typeable)
data FieldT 
  = FieldT  Uident Type
  deriving (Show,Eq,Ord,Data,Typeable)
data Var 
  = Var  Lident
  deriving (Show,Eq,Ord,Data,Typeable)
type ExportDList  = [ExportD ]
type ImportDList  = [ImportD ]
type VarDList  = [VarD ]
type TypeDList  = [TypeD ]
type InstDList  = [InstD ]
type SwitchAltList  = [SwitchAlt ]
type EnumCList  = [EnumC ]
type ConCList  = [ConC ]
type FieldTList  = [FieldT ]
type VarList  = [Var ]
type TypeList  = [Type ]
type CxtList  = [Cxt ]
instance Pretty (Module ) where
  pretty = ppModule
ppModule x = case x of
  Module  v1 v2 v3 v4 v5 v6 -> text "module" <+> ppUident v1 <+> text "{" <+> ppExportDList v2 <+> ppImportDList v3 <+> ppTypeDList v4 <+> ppInstDList v5 <+> ppVarDList v6 <+> text "}"
instance Pretty (ExportD ) where
  pretty = ppExportD
ppExportD x = case x of
  TypeEx  v1 -> text "export" <+> ppUident v1
  VarEx  v1 -> text "export" <+> ppLident v1
instance Pretty (ImportD ) where
  pretty = ppImportD
ppImportD x = case x of
  ImportD  v1 v2 -> text "import" <+> ppUident v1 <+> ppAsSpec v2
instance Pretty (AsSpec ) where
  pretty = ppAsSpec
ppAsSpec x = case x of
  AsAS  v1 -> text "as" <+> ppUident v1
  EmptyAS   -> Text.PrettyPrint.Leijen.empty
instance Pretty (TypeD ) where
  pretty = ppTypeD
ppTypeD x = case x of
  TypeD  v1 v2 v3 -> text "type" <+> ppUident v1 <+> ppVarList v2 <+> text "=" <+> ppTyDecl v3
instance Pretty (VarD ) where
  pretty = ppVarD
ppVarD x = case x of
  VarD  v1 v2 v3 -> ppLident v1 <+> ppDeclSym v2 <+> ppExp v3
instance Pretty (InstD ) where
  pretty = ppInstD
ppInstD x = case x of
  InstD  v1 v2 -> text "instance" <+> ppUident v1 <+> ppType v2
instance Pretty (DeclSym ) where
  pretty = ppDeclSym
ppDeclSym x = case x of
  Macro   -> text "=>"
  Define   -> text "="
instance Pretty (TyDecl ) where
  pretty = ppTyDecl
ppTyDecl x = case x of
  TyRecord  v1 -> text "record" <+> text "{" <+> ppFieldTList v1 <+> text "}"
  TyTagged  v1 -> text "tagged" <+> ppConCList v1
  TyEnum  v1 -> text "enum" <+> ppEnumCList v1
  TySyn  v1 -> text "synonym" <+> ppType v1
  TyNewtype  v1 v2 -> text "newtype" <+> ppUident v1 <+> ppType v2
  TyUnit  v1 -> text "unit" <+> ppUident v1
instance Pretty (Exp ) where
  pretty = ppExp
ppExp x = case x of
  LetE  v1 v2 v3 v4 -> text "let" <+> ppLident v1 <+> ppDeclSym v2 <+> ppExp v3 <+> text "in" <+> ppExp v4
  LamE  v1 v2 -> text "\\" <+> ppLident v1 <+> text "->" <+> ppExp v2
  SwitchE  v1 v2 v3 -> text "switch" <+> ppExp v1 <+> text "of" <+> ppDefault v2 <+> text "{" <+> ppSwitchAltList v3 <+> text "}"
  AppE  v1 v2 -> text "(" <+> ppExp v1 <+> ppExp v2 <+> text ")"
  AscribeE  v1 v2 -> text "(" <+> ppExp v1 <+> text "::" <+> ppType v2 <+> text ")"
  VarE  v1 -> ppLident v1
  LitE  v1 -> ppLit v1
instance Pretty (Default ) where
  pretty = ppDefault
ppDefault x = case x of
  DefaultNone   -> Text.PrettyPrint.Leijen.empty
  DefaultSome  v1 -> ppExp v1
instance Pretty (Lit ) where
  pretty = ppLit
ppLit x = case x of
  CharL  v1 -> ppChar v1
  StringL  v1 -> ppString v1
  NmbrL  v1 -> ppNumber v1
instance Pretty (Type ) where
  pretty = ppType
ppType x = case x of
  TyCxt  v1 v2 -> text "{" <+> ppCxtList v1 <+> text "}" <+> text "=>" <+> ppType v2
  TyFun  v1 v2 -> text "(" <+> ppType v1 <+> text "->" <+> ppType v2 <+> text ")"
  TyVoid   -> text "VoidT"
  TyConstr  v1 v2 -> text "(" <+> ppUident v1 <+> ppTypeList v2 <+> text ")"
  TyVarT  v1 -> ppLident v1
instance Pretty (SwitchAlt ) where
  pretty = ppSwitchAlt
ppSwitchAlt x = case x of
  SwitchAlt  v1 v2 -> ppExp v1 <+> text "->" <+> ppExp v2
instance Pretty (Cxt ) where
  pretty = ppCxt
ppCxt x = case x of
  Cxt  v1 v2 -> ppUident v1 <+> ppVarList v2
instance Pretty (ConC ) where
  pretty = ppConC
ppConC x = case x of
  ConC  v1 v2 -> ppUident v1 <+> ppType v2
instance Pretty (EnumC ) where
  pretty = ppEnumC
ppEnumC x = case x of
  EnumC  v1 -> ppUident v1
instance Pretty (FieldT ) where
  pretty = ppFieldT
ppFieldT x = case x of
  FieldT  v1 v2 -> ppUident v1 <+> text "::" <+> ppType v2
instance Pretty (Var ) where
  pretty = ppVar
ppVar x = case x of
  Var  v1 -> ppLident v1
ppExportDList = ppList ppExportD Terminator ";" Vert
ppImportDList = ppList ppImportD Terminator ";" Vert
ppVarDList = ppList ppVarD Terminator ";" Vert
ppTypeDList = ppList ppTypeD Terminator ";" Vert
ppInstDList = ppList ppInstD Terminator ";" Vert
ppSwitchAltList = ppList ppSwitchAlt Terminator ";" Vert
ppEnumCList = ppList ppEnumC Separator "|" Horiz
ppConCList = ppList ppConC Separator "|" Horiz
ppFieldTList = ppList ppFieldT Separator "," Horiz
ppVarList = ppList ppVar Separator "" Horiz
ppTypeList = ppList ppType Separator "" Horiz
ppCxtList = ppList ppCxt Separator "," Horiz