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.

187 lines
5.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. deriving (Eq, Show, Ord)
  108. data ParsedVar
  109. = UnqualVar
  110. { varId :: Text
  111. , varBegin :: Posn
  112. , varEnd :: Posn
  113. }
  114. | QualVar
  115. { varId :: Text
  116. , varPrefix :: Text
  117. , varBegin :: Posn
  118. , varEnd :: Posn
  119. }
  120. | ModId
  121. { varId :: Text
  122. , varBegin :: Posn
  123. , varEnd :: Posn
  124. }
  125. | BuiltinId
  126. { varId :: Text
  127. , varBuiltin :: BuiltinIdClass
  128. , varBegin :: Posn
  129. , varEnd :: Posn
  130. }
  131. deriving (Eq, Show, Ord)
  132. data BuiltinIdClass
  133. = BuiltinTuple !Int
  134. | BuiltinNil
  135. | BuiltinArrow
  136. deriving (Eq, Show, Ord)
  137. toModId :: ParsedVar -> ParsedVar
  138. toModId x@ModId{} = x
  139. toModId (UnqualVar x y z) = ModId x y z
  140. toModId (QualVar id pref b e) = ModId (pref <> T.singleton '.' <> id) b e
  141. toModId BuiltinId{} =
  142. error "Built-in variable can not be a module identifier!"
  143. instance HasPosn ParsedVar where
  144. startPosn = varBegin
  145. endPosn = varEnd
  146. span sp ep s = s { varBegin = startPosn sp, varEnd = endPosn ep }
  147. instance HasPosn (ModuleItem var) where
  148. startPosn = itemBegin
  149. endPosn = itemEnd
  150. span sp ep s = s { itemBegin = startPosn sp, itemEnd = endPosn ep }