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.

169 lines
4.6 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. | Literal Literal
  14. | ParenExp (FeExpr var)
  15. | SPExpr (FeExpr var) Posn Posn
  16. deriving (Eq, Show, Ord)
  17. instance HasPosn (FeExpr var) where
  18. startPosn (SPExpr _ s _) = s
  19. startPosn _ = error "no start posn in parsed expression?"
  20. endPosn (SPExpr _ _ e) = e
  21. endPosn _ = error "no end posn in parsed expression?"
  22. span sp ep (SPExpr x _ _) = SPExpr x (startPosn sp) (endPosn ep)
  23. span sp ep x = SPExpr x (startPosn sp) (endPosn ep)
  24. data FePat var
  25. = Var var
  26. | Wildcard
  27. | TupPat [FePat var]
  28. | LitPat Literal
  29. | ParenPat (FePat var) -- parsed parentheses
  30. | SPPat (FePat var) Posn Posn
  31. deriving (Eq, Show, Ord)
  32. instance HasPosn (FePat var) where
  33. startPosn (SPPat _ s _) = s
  34. startPosn _ = error "no start posn in parsed expression?"
  35. endPosn (SPPat _ _ e) = e
  36. endPosn _ = error "no end posn in parsed pattern?"
  37. span sp ep (SPPat x _ _) = SPPat x (startPosn sp) (endPosn ep)
  38. span sp ep x = SPPat x (startPosn sp) (endPosn ep)
  39. data FeType var
  40. = Tyvar var
  41. | Tycon var
  42. | Tyapp (FeType var) (FeType var)
  43. | Tyarr (FeType var) (FeType var)
  44. | Tytup [FeType var]
  45. | ParenType (FeType var) -- parsed parentheses
  46. | SPType (FeType var) Posn Posn
  47. deriving (Eq, Show, Ord)
  48. instance HasPosn (FeType var) where
  49. startPosn (SPType _ s _) = s
  50. startPosn _ = error "no start posn in parsed type?"
  51. endPosn (SPType _ _ e) = e
  52. endPosn _ = error "no end posn in parsed type?"
  53. span sp ep (SPType x _ _) = SPType x (startPosn sp) (endPosn ep)
  54. span sp ep x = SPType x (startPosn sp) (endPosn ep)
  55. data FeDecl var
  56. = PatDecl { pdPat :: FePat var, declRhs :: FeRhs var, declBegin :: Posn, declEnd :: Posn }
  57. | FunDecl { fdVar :: var, fdArgs :: [FePat var], declRhs :: FeRhs var, declBegin :: Posn, declEnd :: Posn }
  58. | TySig { tsVars :: [var], tsType :: FeType var, declBegin :: Posn, declEnd :: Posn }
  59. deriving (Eq, Show, Ord)
  60. instance HasPosn (FeDecl var) where
  61. startPosn = declBegin
  62. endPosn = declEnd
  63. span sp ep s = s { declBegin = startPosn sp, declEnd = endPosn ep }
  64. data FeRhs var
  65. = BareRhs { bareRhs :: FeExpr var, rhsWhere :: [FeDecl var], rhsBegin :: Posn, rhsEnd :: Posn }
  66. deriving (Eq, Show, Ord)
  67. instance HasPosn (FeRhs var) where
  68. startPosn = rhsBegin
  69. endPosn = rhsEnd
  70. span sp ep s = s { rhsBegin = startPosn sp, rhsEnd = endPosn ep }
  71. data Literal
  72. = LitString T.Text
  73. | LitNumber Integer
  74. deriving (Eq, Show, Ord)
  75. data FeModule var
  76. = Module { moduleName :: var
  77. , moduleExports :: Maybe [NamespacedItem var]
  78. , moduleImports :: [ModuleImport var]
  79. , moduleItems :: [ModuleItem var]
  80. }
  81. deriving (Eq, Show, Ord)
  82. data ModuleImport var
  83. = Import { importMod :: var
  84. , importList :: Maybe [NamespacedItem var]
  85. , importQualified :: Bool
  86. , importAlias :: Maybe var
  87. , importBegin :: Posn
  88. , importEnd :: Posn
  89. }
  90. deriving (Eq, Show, Ord)
  91. instance HasPosn (ModuleImport var) where
  92. startPosn = importBegin
  93. endPosn = importEnd
  94. span sp ep s = s { importBegin = startPosn sp, importEnd = endPosn ep }
  95. data NamespacedItem var
  96. = IEVar var
  97. | IECon var
  98. | IEModule var
  99. deriving (Eq, Show, Ord)
  100. data ModuleItem var
  101. = ModDecl { itemDecl :: FeDecl var, itemBegin :: Posn, itemEnd :: Posn }
  102. | ModImport { itemImport :: ModuleImport var, itemBegin :: Posn, itemEnd :: Posn }
  103. deriving (Eq, Show, Ord)
  104. data ParsedVar
  105. = UnqualVar
  106. { varId :: Text
  107. , varBegin :: Posn
  108. , varEnd :: Posn
  109. }
  110. | QualVar
  111. { varId :: Text
  112. , varPrefix :: Text
  113. , varBegin :: Posn
  114. , varEnd :: Posn
  115. }
  116. | ModId
  117. { varId :: Text
  118. , varBegin :: Posn
  119. , varEnd :: Posn
  120. }
  121. deriving (Eq, Show, Ord)
  122. toModId :: ParsedVar -> ParsedVar
  123. toModId x@ModId{} = x
  124. toModId (UnqualVar x y z) = ModId x y z
  125. toModId (QualVar id pref b e) = ModId (pref <> T.singleton '.' <> id) b e
  126. instance HasPosn ParsedVar where
  127. startPosn = varBegin
  128. endPosn = varEnd
  129. span sp ep s = s { varBegin = startPosn sp, varEnd = endPosn ep }
  130. instance HasPosn (ModuleItem var) where
  131. startPosn = itemBegin
  132. endPosn = itemEnd
  133. span sp ep s = s { itemBegin = startPosn sp, itemEnd = endPosn ep }