1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363
|
-----------------------------------------------------------------------------
-- |
-- Module : Language.Haskell.Syntax
-- Copyright : (c) The GHC Team, 1997-2000
-- License : BSD-style (see the file libraries/base/LICENSE)
--
-- Maintainer : libraries@haskell.org
-- Stability : experimental
-- Portability : portable
--
-- A suite of datatypes describing the abstract syntax of Haskell 98
-- <http://www.haskell.org/onlinereport/> plus a few extensions:
--
-- * multi-parameter type classes
--
-- * parameters of type class assertions are unrestricted
--
-- This module has been changed so that show is a real show.
-----------------------------------------------------------------------------
module Language.Haskell.Syntax (
-- * Modules
HsModule(..), HsExportSpec(..),
HsImportDecl(..), HsImportSpec(..), HsAssoc(..),
-- * Declarations
HsDecl(..), HsConDecl(..), HsBangType(..),
HsMatch(..), HsRhs(..), HsGuardedRhs(..),
-- * Class Assertions and Contexts
HsQualType(..), HsContext, HsAsst,
-- * Types
HsType(..),
-- * Expressions
HsExp(..), HsStmt(..), HsFieldUpdate(..),
HsAlt(..), HsGuardedAlts(..), HsGuardedAlt(..),
-- * Patterns
HsPat(..), HsPatField(..),
-- * Literals
HsLiteral(..),
-- * Variables, Constructors and Operators
Module(..), HsQName(..), HsName(..), HsQOp(..), HsOp(..),
HsSpecialCon(..), HsCName(..),
-- * Builtin names
-- ** Modules
prelude_mod, main_mod,
-- ** Main function of a program
main_name,
-- ** Constructors
unit_con_name, tuple_con_name, list_cons_name,
unit_con, tuple_con,
-- ** Special identifiers
as_name, qualified_name, hiding_name, minus_name, pling_name,
-- ** Type constructors
unit_tycon_name, fun_tycon_name, list_tycon_name, tuple_tycon_name,
unit_tycon, fun_tycon, list_tycon, tuple_tycon,
-- * Source coordinates
SrcLoc(..),
) where
-- | A position in the source.
data SrcLoc = SrcLoc {
srcFilename :: String,
srcLine :: Int,
srcColumn :: Int
}
deriving (Eq,Ord,Show)
newtype Module = Module String
deriving (Eq,Ord,Show)
-- | Constructors with special syntax.
-- These names are never qualified, and always refer to builtin type or
-- data constructors.
data HsSpecialCon
= HsUnitCon -- ^ Unit type and data constructor @()@
| HsListCon -- ^ List type constructor @[]@
| HsFunCon -- ^ Function type constructor @->@
| HsTupleCon Int -- ^ /n/-ary tuple type and data
-- constructors @(,)@ etc
| HsCons -- ^ list data constructor @(:)@
deriving (Eq,Ord,Show)
-- | This type is used to represent qualified variables, and also
-- qualified constructors.
data HsQName
= Qual Module HsName
| UnQual HsName
| Special HsSpecialCon
deriving (Eq,Ord,Show)
-- | This type is used to represent variables, and also constructors.
data HsName
= HsIdent String -- ^ /varid/ or /conid/.
| HsSymbol String -- ^ /varsym/ or /consym/
deriving (Eq,Ord,Show)
-- | Possibly qualified infix operators (/qop/), appearing in expressions.
data HsQOp
= HsQVarOp HsQName
| HsQConOp HsQName
deriving (Eq,Ord,Show)
-- | Operators, appearing in @infix@ declarations.
data HsOp
= HsVarOp HsName
| HsConOp HsName
deriving (Eq,Ord,Show)
data HsCName
= HsVarName HsName
| HsConName HsName
deriving (Eq,Ord,Show)
data HsModule = HsModule SrcLoc Module (Maybe [HsExportSpec])
[HsImportDecl] [HsDecl]
deriving Show
-- | Export specification.
data HsExportSpec
= HsEVar HsQName -- ^ variable
| HsEAbs HsQName -- ^ @T@:
-- a class or datatype exported abstractly,
-- or a type synonym.
| HsEThingAll HsQName -- ^ @T(..)@:
-- a class exported with all of its methods, or
-- a datatype exported with all of its constructors.
| HsEThingWith HsQName [HsCName] -- ^ @T(C_1,...,C_n)@:
-- a class exported with some of its methods, or
-- a datatype exported with some of its constructors.
| HsEModuleContents Module -- ^ @module M@:
-- re-export a module.
deriving (Eq,Show)
-- | Import declaration.
data HsImportDecl
= HsImportDecl SrcLoc Module Bool (Maybe Module)
(Maybe (Bool,[HsImportSpec]))
deriving (Eq,Show)
-- | Import specification.
data HsImportSpec
= HsIVar HsName -- ^ variable
| HsIAbs HsName -- ^ @T@:
-- the name of a class, datatype or type synonym.
| HsIThingAll HsName -- ^ @T(..)@:
-- a class imported with all of its methods, or
-- a datatype imported with all of its constructors.
| HsIThingWith HsName [HsCName] -- ^ @T(C_1,...,C_n)@:
-- a class imported with some of its methods, or
-- a datatype imported with some of its constructors.
deriving (Eq,Show)
data HsAssoc
= HsAssocNone
| HsAssocLeft
| HsAssocRight
deriving (Eq,Show)
data HsDecl
= HsTypeDecl SrcLoc HsName [HsName] HsType
| HsDataDecl SrcLoc HsContext HsName [HsName] [HsConDecl] [HsQName]
| HsInfixDecl SrcLoc HsAssoc Int [HsOp]
| HsNewTypeDecl SrcLoc HsContext HsName [HsName] HsConDecl [HsQName]
| HsClassDecl SrcLoc HsContext HsName [HsName] [HsDecl]
| HsInstDecl SrcLoc HsContext HsQName [HsType] [HsDecl]
| HsDefaultDecl SrcLoc [HsType]
| HsTypeSig SrcLoc [HsName] HsQualType
| HsFunBind [HsMatch]
| HsPatBind SrcLoc HsPat HsRhs {-where-} [HsDecl]
deriving (Eq,Show)
data HsMatch
= HsMatch SrcLoc HsName [HsPat] HsRhs {-where-} [HsDecl]
deriving (Eq,Show)
data HsConDecl
= HsConDecl SrcLoc HsName [HsBangType]
| HsRecDecl SrcLoc HsName [([HsName],HsBangType)]
deriving (Eq,Show)
data HsBangType
= HsBangedTy HsType
| HsUnBangedTy HsType
deriving (Eq,Show)
data HsRhs
= HsUnGuardedRhs HsExp
| HsGuardedRhss [HsGuardedRhs]
deriving (Eq,Show)
data HsGuardedRhs
= HsGuardedRhs SrcLoc HsExp HsExp
deriving (Eq,Show)
-- | A type qualified with a context.
-- An unqualified type has an empty context.
data HsQualType
= HsQualType HsContext HsType
deriving (Eq,Show)
data HsType
= HsTyFun HsType HsType
| HsTyTuple [HsType]
| HsTyApp HsType HsType
| HsTyVar HsName
| HsTyCon HsQName
deriving (Eq,Show)
type HsContext = [HsAsst]
-- | Class assertions.
-- In Haskell 98, the argument would be a /tyvar/, but this definition
-- allows multiple parameters, and allows them to be /type/s.
type HsAsst = (HsQName,[HsType])
-- | /literal/
data HsLiteral
= HsInt Integer
| HsChar Char
| HsString String
| HsFrac Rational
| HsCharPrim Char -- ^ GHC unboxed character literal
| HsStringPrim String -- ^ GHC unboxed string literal
| HsIntPrim Integer -- ^ GHC unboxed integer literal
| HsFloatPrim Rational -- ^ GHC unboxed float literal
| HsDoublePrim Rational -- ^ GHC unboxed double literal
deriving (Eq,Show)
-- | Haskell expressions.
-- Because it is difficult for parsers to distinguish patterns from
-- expressions, they typically parse them in the same way and then check
-- that they have the appropriate form. Hence the expression type
-- includes some forms that are found only in patterns. After these
-- checks, these constructors should not be used.
data HsExp
= HsVar HsQName
| HsCon HsQName
| HsLit HsLiteral
| HsInfixApp HsExp HsQOp HsExp
| HsApp HsExp HsExp
| HsNegApp HsExp
| HsLambda SrcLoc [HsPat] HsExp
| HsLet [HsDecl] HsExp
| HsIf HsExp HsExp HsExp
| HsCase HsExp [HsAlt]
| HsDo [HsStmt] -- ^ Do expression:
-- The last statement in the list
-- should be an expression.
| HsTuple [HsExp]
| HsList [HsExp]
| HsParen HsExp
| HsLeftSection HsExp HsQOp
| HsRightSection HsQOp HsExp
| HsRecConstr HsQName [HsFieldUpdate]
| HsRecUpdate HsExp [HsFieldUpdate]
| HsEnumFrom HsExp
| HsEnumFromTo HsExp HsExp
| HsEnumFromThen HsExp HsExp
| HsEnumFromThenTo HsExp HsExp HsExp
| HsListComp HsExp [HsStmt]
| HsExpTypeSig SrcLoc HsExp HsQualType
| HsAsPat HsName HsExp -- ^ patterns only
| HsWildCard -- ^ patterns only
| HsIrrPat HsExp -- ^ patterns only
deriving (Eq,Show)
data HsPat
= HsPVar HsName
| HsPLit HsLiteral
| HsPNeg HsPat
| HsPInfixApp HsPat HsQName HsPat
| HsPApp HsQName [HsPat]
| HsPTuple [HsPat]
| HsPList [HsPat]
| HsPParen HsPat
| HsPRec HsQName [HsPatField]
| HsPAsPat HsName HsPat
| HsPWildCard
| HsPIrrPat HsPat
deriving (Eq,Show)
data HsPatField
= HsPFieldPat HsQName HsPat
deriving (Eq,Show)
-- | This type represents both /stmt/ in a @do@-expression,
-- and /qual/ in a list comprehension.
data HsStmt
= HsGenerator SrcLoc HsPat HsExp
| HsQualifier HsExp
| HsLetStmt [HsDecl]
deriving (Eq,Show)
-- | An /fbind/ in a labeled construction or update.
data HsFieldUpdate
= HsFieldUpdate HsQName HsExp
deriving (Eq,Show)
data HsAlt
= HsAlt SrcLoc HsPat HsGuardedAlts [HsDecl]
deriving (Eq,Show)
data HsGuardedAlts
= HsUnGuardedAlt HsExp
| HsGuardedAlts [HsGuardedAlt]
deriving (Eq,Show)
data HsGuardedAlt
= HsGuardedAlt SrcLoc HsExp HsExp
deriving (Eq,Show)
-----------------------------------------------------------------------------
-- Builtin names.
prelude_mod, main_mod :: Module
prelude_mod = Module "Prelude"
main_mod = Module "Main"
main_name :: HsName
main_name = HsIdent "main"
unit_con_name :: HsQName
unit_con_name = Special HsUnitCon
tuple_con_name :: Int -> HsQName
tuple_con_name i = Special (HsTupleCon (i+1))
list_cons_name :: HsQName
list_cons_name = Special HsCons
unit_con :: HsExp
unit_con = HsCon unit_con_name
tuple_con :: Int -> HsExp
tuple_con i = HsCon (tuple_con_name i)
as_name, qualified_name, hiding_name, minus_name, pling_name :: HsName
as_name = HsIdent "as"
qualified_name = HsIdent "qualified"
hiding_name = HsIdent "hiding"
minus_name = HsSymbol "-"
pling_name = HsSymbol "!"
unit_tycon_name, fun_tycon_name, list_tycon_name :: HsQName
unit_tycon_name = unit_con_name
fun_tycon_name = Special HsFunCon
list_tycon_name = Special HsListCon
tuple_tycon_name :: Int -> HsQName
tuple_tycon_name i = tuple_con_name i
unit_tycon, fun_tycon, list_tycon :: HsType
unit_tycon = HsTyCon unit_tycon_name
fun_tycon = HsTyCon fun_tycon_name
list_tycon = HsTyCon list_tycon_name
tuple_tycon :: Int -> HsType
tuple_tycon i = HsTyCon (tuple_tycon_name i)
|