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.

111 lines
2.8 KiB

  1. module Frontend.Syntax where
  2. import Frontend.Parser.Posn
  3. import qualified Data.Text as T
  4. data FeExpr var
  5. = Ref var
  6. | Con var
  7. | App (FeExpr var) (FeExpr var)
  8. | Lam (FePat var) (FeExpr var)
  9. | Let [FeDecl var] (FeExpr var)
  10. | Tuple [FeExpr var]
  11. | Annot (FeExpr var) (FeType var)
  12. | Literal Literal
  13. | ParenExp (FeExpr var)
  14. | SPExpr (FeExpr var) Posn Posn
  15. deriving (Eq, Show, Ord)
  16. instance HasPosn (FeExpr var) where
  17. startPosn (SPExpr _ s _) = s
  18. startPosn _ = error "no start posn in parsed expression?"
  19. endPosn (SPExpr _ _ e) = e
  20. endPosn _ = error "no end posn in parsed expression?"
  21. span sp ep (SPExpr x _ _) = SPExpr x (startPosn sp) (endPosn ep)
  22. span sp ep x = SPExpr x (startPosn sp) (endPosn ep)
  23. data FePat var
  24. = Var var
  25. | Wildcard
  26. | TupPat [FePat var]
  27. | LitPat Literal
  28. | ParenPat (FePat var) -- parsed parentheses
  29. | SPPat (FePat var) Posn Posn
  30. deriving (Eq, Show, Ord)
  31. instance HasPosn (FePat var) where
  32. startPosn (SPPat _ s _) = s
  33. startPosn _ = error "no start posn in parsed expression?"
  34. endPosn (SPPat _ _ e) = e
  35. endPosn _ = error "no end posn in parsed pattern?"
  36. span sp ep (SPPat x _ _) = SPPat x (startPosn sp) (endPosn ep)
  37. span sp ep x = SPPat x (startPosn sp) (endPosn ep)
  38. data FeType var
  39. = Tyvar var
  40. | Tycon var
  41. | Tyapp (FeType var) (FeType var)
  42. | Tyarr (FeType var) (FeType var)
  43. | Tytup [FeType var]
  44. | ParenType (FeType var) -- parsed parentheses
  45. | SPType (FeType var) Posn Posn
  46. deriving (Eq, Show, Ord)
  47. instance HasPosn (FeType var) where
  48. startPosn (SPType _ s _) = s
  49. startPosn _ = error "no start posn in parsed type?"
  50. endPosn (SPType _ _ e) = e
  51. endPosn _ = error "no end posn in parsed type?"
  52. span sp ep (SPType x _ _) = SPType x (startPosn sp) (endPosn ep)
  53. span sp ep x = SPType x (startPosn sp) (endPosn ep)
  54. data FeDecl var
  55. = PatDecl (FePat var) (FeRhs var)
  56. | FunDecl var [FePat var] (FeRhs var)
  57. | TySig var (FeType var)
  58. deriving (Eq, Show, Ord)
  59. data FeRhs var
  60. = BareRhs (FeExpr var) [FeDecl var]
  61. deriving (Eq, Show, Ord)
  62. data Literal
  63. = LitString T.Text
  64. | LitNumber Integer
  65. deriving (Eq, Show, Ord)
  66. data FeModule var
  67. = Module { moduleName :: var
  68. , moduleExports :: Maybe [NamespacedItem var]
  69. , moduleItems :: [ModuleItem var]
  70. }
  71. deriving (Eq, Show, Ord)
  72. data ModuleImport var
  73. = Import { importMod :: var
  74. , importList :: Maybe [NamespacedItem var]
  75. , importQualified :: Bool
  76. , importAlias :: Maybe var
  77. }
  78. deriving (Eq, Show, Ord)
  79. data NamespacedItem var
  80. = IEVar var
  81. | IECon var
  82. | IEModule var
  83. deriving (Eq, Show, Ord)
  84. data ModuleItem var
  85. = ModDecl (FeDecl var)
  86. | ModImport (ModuleImport var)
  87. deriving (Eq, Show, Ord)