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.

142 lines
3.5 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 (FePat var) (FeRhs var)
  57. | FunDecl var [FePat var] (FeRhs var)
  58. | TySig [var] (FeType var)
  59. deriving (Eq, Show, Ord)
  60. data FeRhs var
  61. = BareRhs (FeExpr var) [FeDecl var]
  62. deriving (Eq, Show, Ord)
  63. data Literal
  64. = LitString T.Text
  65. | LitNumber Integer
  66. deriving (Eq, Show, Ord)
  67. data FeModule var
  68. = Module { moduleName :: var
  69. , moduleExports :: Maybe [NamespacedItem var]
  70. , moduleItems :: [ModuleItem var]
  71. }
  72. deriving (Eq, Show, Ord)
  73. data ModuleImport var
  74. = Import { importMod :: var
  75. , importList :: Maybe [NamespacedItem var]
  76. , importQualified :: Bool
  77. , importAlias :: Maybe var
  78. }
  79. deriving (Eq, Show, Ord)
  80. data NamespacedItem var
  81. = IEVar var
  82. | IECon var
  83. | IEModule var
  84. deriving (Eq, Show, Ord)
  85. data ModuleItem var
  86. = ModDecl (FeDecl var)
  87. | ModImport (ModuleImport var)
  88. deriving (Eq, Show, Ord)
  89. data ParsedVar
  90. = UnqualVar
  91. { varId :: Text
  92. , varBegin :: Posn
  93. , varEnd :: Posn
  94. }
  95. | QualVar
  96. { varId :: Text
  97. , varPrefix :: Text
  98. , varBegin :: Posn
  99. , varEnd :: Posn
  100. }
  101. | ModId
  102. { varId :: Text
  103. , varBegin :: Posn
  104. , varEnd :: Posn
  105. }
  106. deriving (Eq, Show, Ord)
  107. toModId :: ParsedVar -> ParsedVar
  108. toModId x@ModId{} = x
  109. toModId (UnqualVar x y z) = ModId x y z
  110. toModId (QualVar id pref b e) = ModId (pref <> T.singleton '.' <> id) b e
  111. instance HasPosn ParsedVar where
  112. startPosn = varBegin
  113. endPosn = varEnd
  114. span sp ep s = s { varBegin = startPosn sp, varEnd = endPosn ep }