Abbie's Haskell compiler
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

227 lines
6.0 KiB

  1. module Frontend.Syntax where
  2. import Frontend.Parser.Posn
  3. import qualified Data.Text as T
  4. import Data.Text (Text)
  5. data FeExpr var
  6. = Ref var
  7. | Con var
  8. | App (FeExpr var) (FeExpr var)
  9. | Lam (FePat var) (FeExpr var)
  10. | Let [FeDecl var] (FeExpr var)
  11. | Tuple [FeExpr var]
  12. | Annot (FeExpr var) (FeType var)
  13. | Infix (FeExpr var) var (FeExpr var)
  14. | Literal Literal
  15. | ParenExp (FeExpr var)
  16. | SPExpr (FeExpr var) Posn Posn
  17. deriving (Eq, Show, Ord)
  18. instance HasPosn (FeExpr var) where
  19. startPosn (SPExpr _ s _) = s
  20. startPosn _ = error "no start posn in parsed expression?"
  21. endPosn (SPExpr _ _ e) = e
  22. endPosn _ = error "no end posn in parsed expression?"
  23. span sp ep (SPExpr x _ _) = SPExpr x (startPosn sp) (endPosn ep)
  24. span sp ep x = SPExpr x (startPosn sp) (endPosn ep)
  25. data FePat var
  26. = Var var
  27. | Wildcard
  28. | TupPat [FePat var]
  29. | LitPat Literal
  30. | ConPat var [FePat var]
  31. | InfixPat (FePat var) var (FePat var)
  32. | ParenPat (FePat var) -- parsed parentheses
  33. | SPPat (FePat var) Posn Posn
  34. deriving (Eq, Show, Ord)
  35. instance HasPosn (FePat var) where
  36. startPosn (SPPat _ s _) = s
  37. startPosn _ = error "no start posn in parsed expression?"
  38. endPosn (SPPat _ _ e) = e
  39. endPosn _ = error "no end posn in parsed pattern?"
  40. span sp ep (SPPat x _ _) = SPPat x (startPosn sp) (endPosn ep)
  41. span sp ep x = SPPat x (startPosn sp) (endPosn ep)
  42. data FeType var
  43. = Tyvar var
  44. | Tycon var
  45. | Tyapp (FeType var) (FeType var)
  46. | Tyarr (FeType var) (FeType var)
  47. | Tytup [FeType var]
  48. | Tylist (FeType var)
  49. | ParenType (FeType var) -- parsed parentheses
  50. | SPType (FeType var) Posn Posn
  51. deriving (Eq, Show, Ord)
  52. instance HasPosn (FeType var) where
  53. startPosn (SPType _ s _) = s
  54. startPosn _ = error "no start posn in parsed type?"
  55. endPosn (SPType _ _ e) = e
  56. endPosn _ = error "no end posn in parsed type?"
  57. span sp ep (SPType x _ _) = SPType x (startPosn sp) (endPosn ep)
  58. span sp ep x = SPType x (startPosn sp) (endPosn ep)
  59. data FeDecl var
  60. = PatDecl { pdPat :: FePat var, declRhs :: FeRhs var, declBegin :: Posn, declEnd :: Posn }
  61. | FunDecl { fdVar :: var, fdArgs :: [FePat var], declRhs :: FeRhs var, declBegin :: Posn, declEnd :: Posn }
  62. | TySig { tsVars :: [var], tsType :: FeType var, declBegin :: Posn, declEnd :: Posn }
  63. deriving (Eq, Show, Ord)
  64. instance HasPosn (FeDecl var) where
  65. startPosn = declBegin
  66. endPosn = declEnd
  67. span sp ep s = s { declBegin = startPosn sp, declEnd = endPosn ep }
  68. data FeRhs var
  69. = BareRhs { bareRhs :: FeExpr var, rhsWhere :: [FeDecl var], rhsBegin :: Posn, rhsEnd :: Posn }
  70. deriving (Eq, Show, Ord)
  71. instance HasPosn (FeRhs var) where
  72. startPosn = rhsBegin
  73. endPosn = rhsEnd
  74. span sp ep s = s { rhsBegin = startPosn sp, rhsEnd = endPosn ep }
  75. data Literal
  76. = LitString T.Text
  77. | LitNumber Integer
  78. deriving (Eq, Show, Ord)
  79. data FeModule var
  80. = Module { moduleName :: var
  81. , moduleExports :: Maybe [NamespacedItem var]
  82. , moduleImports :: [ModuleImport var]
  83. , moduleItems :: [ModuleItem var]
  84. }
  85. deriving (Eq, Show, Ord)
  86. data ModuleImport var
  87. = Import { importMod :: var
  88. , importList :: Maybe [NamespacedItem var]
  89. , importQualified :: Bool
  90. , importAlias :: Maybe var
  91. , importBegin :: Posn
  92. , importEnd :: Posn
  93. }
  94. deriving (Eq, Show, Ord)
  95. instance HasPosn (ModuleImport var) where
  96. startPosn = importBegin
  97. endPosn = importEnd
  98. span sp ep s = s { importBegin = startPosn sp, importEnd = endPosn ep }
  99. data NamespacedItem var
  100. = IEVar var
  101. | IECon var
  102. | IEModule var
  103. deriving (Eq, Show, Ord)
  104. data ModuleItem var
  105. = ModDecl { itemDecl :: FeDecl var, itemBegin :: Posn, itemEnd :: Posn }
  106. | ModImport { itemImport :: ModuleImport var, itemBegin :: Posn, itemEnd :: Posn }
  107. | ModFfi { itemForeign :: FfiItem var, itemBegin :: Posn, itemEnd :: Posn }
  108. deriving (Eq, Show, Ord)
  109. data FfiItem var
  110. = FfiImport
  111. { fiVarName :: var
  112. , fiType :: FeType var
  113. , fiCallConv :: FfiCallConv
  114. , fiSafety :: Maybe FfiSafety
  115. , fiItem :: Maybe FfiImpEnt
  116. , fiBegin :: Posn
  117. , fiEnd :: Posn
  118. }
  119. | FfiExport
  120. { fiVarName :: var
  121. , fiType :: FeType var
  122. , fiCallConv :: FfiCallConv
  123. , fiExpCid :: Maybe Text
  124. , fiBegin :: Posn
  125. , fiEnd :: Posn
  126. }
  127. deriving (Eq, Show, Ord)
  128. data FfiCallConv = CC_CCall deriving (Eq, Show, Ord)
  129. data FfiSafety = Safe | Unsafe deriving (Eq, Show, Ord)
  130. data FfiImpEnt
  131. = ForeignItem
  132. { fiItemName :: Maybe Text
  133. , fiHeader :: Maybe Text
  134. , fiStatic :: Bool
  135. , fiIsRef :: Bool
  136. }
  137. | Dynamic
  138. | Wrapper
  139. deriving (Eq, Show, Ord)
  140. data ParsedVar
  141. = UnqualVar
  142. { varId :: Text
  143. , varBegin :: Posn
  144. , varEnd :: Posn
  145. }
  146. | QualVar
  147. { varId :: Text
  148. , varPrefix :: Text
  149. , varBegin :: Posn
  150. , varEnd :: Posn
  151. }
  152. | ModId
  153. { varId :: Text
  154. , varBegin :: Posn
  155. , varEnd :: Posn
  156. }
  157. | BuiltinId
  158. { varId :: Text
  159. , varBuiltin :: BuiltinIdClass
  160. , varBegin :: Posn
  161. , varEnd :: Posn
  162. }
  163. deriving (Eq, Show, Ord)
  164. data BuiltinIdClass
  165. = BuiltinTuple !Int
  166. | BuiltinNil
  167. | BuiltinArrow
  168. deriving (Eq, Show, Ord)
  169. toModId :: ParsedVar -> ParsedVar
  170. toModId x@ModId{} = x
  171. toModId (UnqualVar x y z) = ModId x y z
  172. toModId (QualVar id pref b e) = ModId (pref <> T.singleton '.' <> id) b e
  173. toModId BuiltinId{} =
  174. error "Built-in variable can not be a module identifier!"
  175. instance HasPosn ParsedVar where
  176. startPosn = varBegin
  177. endPosn = varEnd
  178. span sp ep s = s { varBegin = startPosn sp, varEnd = endPosn ep }
  179. instance HasPosn (ModuleItem var) where
  180. startPosn = itemBegin
  181. endPosn = itemEnd
  182. span sp ep s = s { itemBegin = startPosn sp, itemEnd = endPosn ep }
  183. instance HasPosn (FfiItem var) where
  184. startPosn = fiBegin
  185. endPosn = fiEnd
  186. span sp ep s = s { fiBegin = startPosn sp, fiEnd = endPosn ep }