{
#include "HsVersions.h"
-module ParseIface (
- parseIface,
-
- ParsedIface(..), RdrIfaceDecl(..),
-
- ExportsMap(..), LocalDefsMap(..), LocalPragmasMap(..),
- LocalVersionsMap(..), PragmaStuff(..)
-
- ) where
+module ParseIface ( parseIface ) where
import Ubiq{-uitous-}
-import HsSyn ( ClassDecl, InstDecl, TyDecl, PolyType, InPat, Fake )
-import RdrHsSyn ( RdrNameTyDecl(..), RdrNameClassDecl(..),
- RdrNamePolyType(..), RdrNameInstDecl(..)
- )
-import FiniteMap ( emptyFM, listToFM, fmToList, lookupFM, keysFM, FiniteMap )
-import Name ( ExportFlag(..) )
-import Util ( startsWith )
------------------------------------------------------------------
+import ParseUtils
-parseIface = parseIToks . lexIface
+import HsSyn -- quite a bit of stuff
+import RdrHsSyn -- oodles of synonyms
+import HsPragmas ( noGenPragmas )
-type LocalVersionsMap = FiniteMap FAST_STRING Version
-type ExportsMap = FiniteMap FAST_STRING (RdrName, ExportFlag)
-type LocalDefsMap = FiniteMap FAST_STRING RdrIfaceDecl
-type LocalPragmasMap = FiniteMap FAST_STRING PragmaStuff
-
-type PragmaStuff = String
-
-data ParsedIface
- = ParsedIface
- Module -- Module name
- Version -- Module version number
- (Maybe Version) -- Source version number
- LocalVersionsMap -- Local version numbers
- ExportsMap -- Exported names
- [Module] -- Special instance modules
- LocalDefsMap -- Local names defined
- [RdrIfaceDecl] -- Local instance declarations
- LocalPragmasMap -- Pragmas for local names
-
-{-
-instance Text ParsedIface where
- showsPrec _ (ParsedIface m v mv lcm exm ims ldm lids ldp)
- = showString "interface "
- . showString (_UNPK_ m)
- . showChar ' '
- . showInt v
- . showString "\n__versions__\n"
- . showList (fmToList lcm)
- . showString "\n__exports__\n"
- . showList (fmToList exm)
- . showString "\n__instance_modules__\n"
- . showList (map _UNPK_ ims)
- . showString "\n__declarations__\n"
- . showList (map _UNPK_ (keysFM ldm))
- . showString "\n__instances__\n"
- . showList lids
- . showString "\n__pragmas__\n"
- . showList (map _UNPK_ (keysFM ldp))
--}
+import Bag ( emptyBag, unitBag, snocBag )
+import FiniteMap ( emptyFM, unitFM, addToFM, plusFM, bagToFM )
+import Name ( ExportFlag(..), mkTupNameStr,
+ RdrName(..){-instance Outputable:ToDo:rm-}
+ )
+import Outputable -- ToDo:rm
+import PprStyle ( PprStyle(..) ) -- ToDo: rm debugging
+import SrcLoc ( mkIfaceSrcLoc )
+import Util ( pprPanic{-ToDo:rm-} )
-----------------------------------------------------------------
-data RdrIfaceDecl
- = TypeSig RdrName Bool SrcLoc RdrNameTyDecl
- | NewTypeSig RdrName RdrName Bool SrcLoc RdrNameTyDecl
- | DataSig RdrName [RdrName] Bool SrcLoc RdrNameTyDecl
- | ClassSig RdrName [RdrName] Bool SrcLoc RdrNameClassDecl
- | ValSig RdrName Bool SrcLoc RdrNamePolyType
- | InstSig RdrName RdrName Bool SrcLoc RdrNameInstDecl
- -- True => Source Iface decl
------------
-type Version = Int
+parseIface = parseIToks . lexIface
-----------------------------------------------------------------
}
%name parseIToks
%tokentype { IfaceToken }
+%monad { IfM }{ thenIf }{ returnIf }
%token
- interface { ITinterface }
- versions_part { ITversions }
- exports_part { ITexports }
- instance_modules_part { ITinstance_modules }
- instances_part { ITinstances }
- declarations_part { ITdeclarations }
- pragmas_part { ITpragmas }
- data { ITdata }
- type { ITtype }
- newtype { ITnewtype }
- class { ITclass }
- where { ITwhere }
- instance { ITinstance }
- bar { ITbar }
- colons { ITcolons }
- comma { ITcomma }
- dblrarrow { ITdblrarrow }
- dot { ITdot }
- dotdot { ITdotdot }
- equal { ITequal }
- lbrace { ITlbrace }
- lbrack { ITlbrack }
- lparen { ITlparen }
- rarrow { ITrarrow }
- rbrace { ITrbrace }
- rbrack { ITrbrack }
- rparen { ITrparen }
- semicolon { ITsemicolon }
- num { ITnum $$ }
- name { ITname $$ }
+ INTERFACE { ITinterface }
+ VERSIONS_PART { ITversions }
+ EXPORTS_PART { ITexports }
+ INSTANCE_MODULES_PART { ITinstance_modules }
+ INSTANCES_PART { ITinstances }
+ FIXITIES_PART { ITfixities }
+ DECLARATIONS_PART { ITdeclarations }
+ PRAGMAS_PART { ITpragmas }
+ BANG { ITbang }
+ BQUOTE { ITbquote }
+ CBRACK { ITcbrack }
+ CCURLY { ITccurly }
+ CLASS { ITclass }
+ COMMA { ITcomma }
+ CPAREN { ITcparen }
+ DARROW { ITdarrow }
+ DATA { ITdata }
+ DCOLON { ITdcolon }
+ DOTDOT { ITdotdot }
+ EQUAL { ITequal }
+ INFIX { ITinfix }
+ INFIXL { ITinfixl }
+ INFIXR { ITinfixr }
+ INSTANCE { ITinstance }
+ NEWTYPE { ITnewtype }
+ OBRACK { ITobrack }
+ OCURLY { ITocurly }
+ OPAREN { IToparen }
+ RARROW { ITrarrow }
+ SEMI { ITsemi }
+ TYPE { ITtype }
+ VBAR { ITvbar }
+ WHERE { ITwhere }
+ INTEGER { ITinteger $$ }
+ VARID { ITvarid $$ }
+ CONID { ITconid $$ }
+ VARSYM { ITvarsym $$ }
+ CONSYM { ITconsym $$ }
+ QVARID { ITqvarid $$ }
+ QCONID { ITqconid $$ }
+ QVARSYM { ITqvarsym $$ }
+ QCONSYM { ITqconsym $$ }
%%
-Iface :: { ParsedIface }
-Iface : interface name num
- VersionsPart ExportsPart InstanceModulesPart
- DeclsPart InstancesPart PragmasPart
- { ParsedIface $2 (fromInteger $3) Nothing{-src version-}
+iface :: { ParsedIface }
+iface : INTERFACE CONID INTEGER
+ versions_part exports_part inst_modules_part
+ fixities_part decls_part instances_part pragmas_part
+ { case $8 of { (tm, vm) ->
+ ParsedIface $2 (fromInteger $3) Nothing{-src version-}
$4 -- local versions
$5 -- exports map
$6 -- instance modules
- $7 -- decls map
- $8 -- local instances
- $9 -- pragmas map
+ $7 -- fixities map
+ tm -- decls maps
+ vm
+ $9 -- local instances
+ $10 -- pragmas map
+ }
+--------------------------------------------------------------------------
}
-VersionsPart :: { LocalVersionsMap }
-VersionsPart : versions_part NameVersionPairs
- { listToFM $2 }
-
-NameVersionPairs :: { [(FAST_STRING, Int)] }
-NameVersionPairs : NameVersionPairs name lparen num rparen
- { ($2, fromInteger $4) : $1 }
- | { [] }
-
-ExportsPart :: { ExportsMap }
-ExportsPart : exports_part ExportItems
- { listToFM $2 }
-
-ExportItems :: { [(FAST_STRING, (RdrName, ExportFlag))] }
-ExportItems : ExportItems name dot name MaybeDotDot
- { ($4, (Qual $2 $4, $5)) : $1 }
- | { [] }
-
-MaybeDotDot :: { ExportFlag }
-MaybeDotDot : dotdot { ExportAll }
- | { ExportAbs }
-
-InstanceModulesPart :: { [Module] }
-InstanceModulesPart : instance_modules_part ModList
- { $2 }
-
-ModList :: { [Module] }
-ModList : ModList name { $2 : $1 }
- | { [] }
-
-DeclsPart :: { LocalDefsMap }
-DeclsPart : declarations_part
- { emptyFM }
-
-InstancesPart :: { [RdrIfaceDecl] }
-InstancesPart : instances_part
- { [] }
-
-PragmasPart :: { LocalPragmasMap }
-PragmasPart : pragmas_part
+versions_part :: { LocalVersionsMap }
+versions_part : VERSIONS_PART name_version_pairs
+ { bagToFM $2 }
+
+name_version_pairs :: { Bag (FAST_STRING, Int) }
+name_version_pairs : iname OPAREN INTEGER CPAREN
+ { unitBag ($1, fromInteger $3) }
+ | name_version_pairs iname OPAREN INTEGER CPAREN
+ { $1 `snocBag` ($2, fromInteger $4)
+--------------------------------------------------------------------------
+ }
+
+exports_part :: { ExportsMap }
+exports_part : EXPORTS_PART export_items { bagToFM $2 }
+
+export_items :: { Bag (FAST_STRING, (RdrName, ExportFlag)) }
+export_items : qiname maybe_dotdot
+ { unitBag (de_qual $1, ($1, $2)) }
+ | export_items qiname maybe_dotdot
+ { $1 `snocBag` (de_qual $2, ($2, $3)) }
+
+maybe_dotdot :: { ExportFlag }
+maybe_dotdot : DOTDOT { ExportAll }
+ | { ExportAbs
+--------------------------------------------------------------------------
+ }
+
+inst_modules_part :: { Bag Module }
+inst_modules_part : INSTANCE_MODULES_PART mod_list { $2 }
+ | { emptyBag }
+
+mod_list :: { Bag Module }
+mod_list : CONID { unitBag $1 }
+ | mod_list CONID { $1 `snocBag` $2
+--------------------------------------------------------------------------
+ }
+
+fixities_part :: { FixitiesMap }
+fixities_part : FIXITIES_PART fixes { $2 }
+ | { emptyFM }
+
+fixes :: { FixitiesMap }
+fixes : fix { case $1 of (k,v) -> unitFM k v }
+ | fixes SEMI fix { case $3 of (k,v) -> addToFM $1 k v }
+
+fix :: { (FAST_STRING, RdrNameFixityDecl) }
+fix : INFIXL INTEGER qop { (de_qual $3, InfixL $3 (fromInteger $2)) }
+ | INFIXR INTEGER qop { (de_qual $3, InfixR $3 (fromInteger $2)) }
+ | INFIX INTEGER qop { (de_qual $3, InfixN $3 (fromInteger $2))
+--------------------------------------------------------------------------
+ }
+
+decls_part :: { (LocalTyDefsMap, LocalValDefsMap) }
+decls_part : DECLARATIONS_PART topdecls { $2 }
+
+topdecls :: { (LocalTyDefsMap, LocalValDefsMap) }
+topdecls : topdecl { $1 }
+ | topdecls SEMI topdecl { case $1 of { (ts1, vs1) ->
+ case $3 of { (ts2, vs2) ->
+ (plusFM ts1 ts2, plusFM vs1 vs2)}}
+ }
+
+topdecl :: { (LocalTyDefsMap, LocalValDefsMap) }
+topdecl : typed { ($1, emptyFM) }
+ | datad { $1 }
+ | newtd { $1 }
+ | classd { $1 }
+ | decl { case $1 of { (n, Sig qn ty _ loc) ->
+ (emptyFM, unitFM n (ValSig qn loc ty)) }
+ }
+
+typed :: { LocalTyDefsMap }
+typed : TYPE simple EQUAL type { mk_type $2 $4 }
+
+datad :: { (LocalTyDefsMap, LocalValDefsMap) }
+datad : DATA simple EQUAL constrs { mk_data [] $2 $4 }
+ | DATA context DARROW simple EQUAL constrs { mk_data $2 $4 $6 }
+
+newtd :: { (LocalTyDefsMap, LocalValDefsMap) }
+newtd : NEWTYPE simple EQUAL constr1 { mk_new [] $2 $4 }
+ | NEWTYPE context DARROW simple EQUAL constr1 { mk_new $2 $4 $6 }
+
+classd :: { (LocalTyDefsMap, LocalValDefsMap) }
+classd : CLASS class cbody { mk_class [] $2 $3 }
+ | CLASS context DARROW class cbody { mk_class $2 $4 $5 }
+
+cbody :: { [(FAST_STRING, RdrNameSig)] }
+cbody : WHERE OCURLY decls CCURLY { $3 }
+ | { [] }
+
+decls :: { [(FAST_STRING, RdrNameSig)] }
+decls : decl { [$1] }
+ | decls SEMI decl { $1 ++ [$3] }
+
+decl :: { (FAST_STRING, RdrNameSig) }
+decl : var DCOLON ctype { (de_qual $1, Sig $1 $3 noGenPragmas mkIfaceSrcLoc) }
+
+context :: { RdrNameContext }
+context : OPAREN context_list CPAREN { reverse $2 }
+ | class { [$1] }
+
+context_list :: { RdrNameContext{-reversed-} }
+context_list : class { [$1] }
+ | context_list COMMA class { $3 : $1 }
+
+class :: { (RdrName, RdrName) }
+class : gtycon VARID { ($1, Unqual $2) }
+
+ctype :: { RdrNamePolyType }
+ctype : type DARROW type { HsPreForAllTy (type2context $1) $3 }
+ | type { HsPreForAllTy [] $1 }
+
+type :: { RdrNameMonoType }
+type : btype { $1 }
+ | btype RARROW type { MonoFunTy $1 $3 }
+
+types :: { [RdrNameMonoType] }
+types : type { [$1] }
+ | types COMMA type { $1 ++ [$3] }
+
+btype :: { RdrNameMonoType }
+btype : gtyconapp { case $1 of (tc, tys) -> MonoTyApp tc tys }
+ | ntyconapp { case $1 of { (ty1, tys) ->
+ if null tys
+ then ty1
+ else
+ case ty1 of {
+ MonoTyVar tv -> MonoTyApp tv tys;
+ MonoTyApp tc ts -> MonoTyApp tc (ts++tys);
+ MonoFunTy t1 t2 -> MonoTyApp (Unqual SLIT("->")) (t1:t2:tys);
+ MonoListTy ty -> MonoTyApp (Unqual SLIT("[]")) (ty:tys);
+ MonoTupleTy ts -> MonoTyApp (Unqual (mkTupNameStr (length ts)))
+ (ts++tys);
+ _ -> pprPanic "test:" (ppr PprDebug $1)
+ }}
+ }
+
+ntyconapp :: { (RdrNameMonoType, [RdrNameMonoType]) }
+ntyconapp : ntycon { ($1, []) }
+ | ntyconapp atype { case $1 of (t1,tys) -> (t1, tys ++ [$2]) }
+
+gtyconapp :: { (RdrName, [RdrNameMonoType]) }
+gtyconapp : gtycon { ($1, []) }
+ | gtyconapp atype { case $1 of (tc,tys) -> (tc, tys ++ [$2]) }
+
+atype :: { RdrNameMonoType }
+atype : gtycon { MonoTyApp $1 [] }
+ | ntycon { $1 }
+
+atypes :: { [RdrNameMonoType] }
+atypes : atype { [$1] }
+ | atypes atype { $1 ++ [$2] }
+
+ntycon :: { RdrNameMonoType }
+ntycon : VARID { MonoTyVar (Unqual $1) }
+ | OPAREN type COMMA types CPAREN { MonoTupleTy ($2 : $4) }
+ | OBRACK type CBRACK { MonoListTy $2 }
+ | OPAREN type CPAREN { $2 }
+
+gtycon :: { RdrName }
+gtycon : QCONID { $1 }
+ | CONID { Unqual $1 }
+ | OPAREN RARROW CPAREN { Unqual SLIT("->") }
+ | OBRACK CBRACK { Unqual SLIT("[]") }
+ | OPAREN CPAREN { Unqual SLIT("()") }
+ | OPAREN commas CPAREN { Unqual (mkTupNameStr $2) }
+
+commas :: { Int }
+commas : COMMA { 2{-1 comma => arity 2-} }
+ | commas COMMA { $1 + 1 }
+
+simple :: { (RdrName, [FAST_STRING]) }
+simple : gtycon { ($1, []) }
+ | gtyconvars { case $1 of (tc,tvs) -> (tc, reverse tvs) }
+
+gtyconvars :: { (RdrName, [FAST_STRING] {-reversed-}) }
+gtyconvars : gtycon VARID { ($1, [$2]) }
+ | gtyconvars VARID { case $1 of (tc,tvs) -> (tc, $2 : tvs) }
+
+constrs :: { [(RdrName, RdrNameConDecl)] }
+constrs : constr { [$1] }
+ | constrs VBAR constr { $1 ++ [$3] }
+
+constr :: { (RdrName, RdrNameConDecl) }
+constr : btyconapp
+ { case $1 of (con, tys) -> (con, ConDecl con tys mkIfaceSrcLoc) }
+ | OPAREN QCONSYM CPAREN { ($2, ConDecl $2 [] mkIfaceSrcLoc) }
+ | OPAREN QCONSYM CPAREN batypes { ($2, ConDecl $2 $4 mkIfaceSrcLoc) }
+ | OPAREN CONSYM CPAREN { (Unqual $2, ConDecl (Unqual $2) [] mkIfaceSrcLoc) }
+ | OPAREN CONSYM CPAREN batypes { (Unqual $2, ConDecl (Unqual $2) $4 mkIfaceSrcLoc) }
+ | gtycon OCURLY fields CCURLY
+ { ($1, RecConDecl $1 $3 mkIfaceSrcLoc) }
+
+btyconapp :: { (RdrName, [RdrNameBangType]) }
+btyconapp : gtycon { ($1, []) }
+ | btyconapp batype { case $1 of (tc,tys) -> (tc, tys ++ [$2]) }
+
+bbtype :: { RdrNameBangType }
+bbtype : btype { Unbanged $1 }
+ | BANG atype { Banged $2 }
+
+batype :: { RdrNameBangType }
+batype : atype { Unbanged $1 }
+ | BANG atype { Banged $2 }
+
+batypes :: { [RdrNameBangType] }
+batypes : batype { [$1] }
+ | batypes batype { $1 ++ [$2] }
+
+fields :: { [([RdrName], RdrNameBangType)] }
+fields : field { [$1] }
+ | fields COMMA field { $1 ++ [$3] }
+
+field :: { ([RdrName], RdrNameBangType) }
+field : var DCOLON type { ([$1], Unbanged $3) }
+ | var DCOLON BANG atype { ([$1], Banged $4) }
+
+constr1 :: { (RdrName, RdrNameMonoType) }
+constr1 : gtycon atype { ($1, $2) }
+
+var :: { RdrName }
+var : QVARID { $1 }
+ | OPAREN QVARSYM CPAREN { $2 }
+ | VARID { Unqual $1 }
+ | OPAREN VARSYM CPAREN { Unqual $2 }
+
+op :: { FAST_STRING }
+op : BQUOTE VARID BQUOTE { $2 }
+ | BQUOTE CONID BQUOTE { $2 }
+ | VARSYM { $1 }
+ | CONSYM { $1 }
+
+qop :: { RdrName }
+qop : BQUOTE QVARID BQUOTE { $2 }
+ | BQUOTE QCONID BQUOTE { $2 }
+ | QVARSYM { $1 }
+ | QCONSYM { $1 }
+ | op { Unqual $1 }
+
+iname :: { FAST_STRING }
+iname : VARID { $1 }
+ | CONID { $1 }
+ | OPAREN VARSYM CPAREN { $2 }
+ | OPAREN CONSYM CPAREN { $2 }
+
+qiname :: { RdrName }
+qiname : QVARID { $1 }
+ | QCONID { $1 }
+ | OPAREN QVARSYM CPAREN { $2 }
+ | OPAREN QCONSYM CPAREN { $2 }
+ | iname { Unqual $1 }
+
+instances_part :: { Bag RdrIfaceInst }
+instances_part : INSTANCES_PART instdecls { $2 }
+ | { emptyBag }
+
+instdecls :: { Bag RdrIfaceInst }
+instdecls : instd { unitBag $1 }
+ | instdecls SEMI instd { $1 `snocBag` $3 }
+
+instd :: { RdrIfaceInst }
+instd : INSTANCE context DARROW gtycon restrict_inst { mk_inst $2 $4 $5 }
+ | INSTANCE gtycon general_inst { mk_inst [] $2 $3 }
+
+restrict_inst :: { RdrNameMonoType }
+restrict_inst : gtycon { MonoTyApp $1 [] }
+ | OPAREN gtyconvars CPAREN { case $2 of (tc,tvs) -> MonoTyApp tc (map en_mono tvs) }
+ | OPAREN VARID COMMA tyvar_list CPAREN { MonoTupleTy (map en_mono ($2:$4)) }
+ | OBRACK VARID CBRACK { MonoListTy (en_mono $2) }
+ | OPAREN VARID RARROW VARID CPAREN { MonoFunTy (en_mono $2) (en_mono $4) }
+
+general_inst :: { RdrNameMonoType }
+general_inst : gtycon { MonoTyApp $1 [] }
+ | OPAREN gtyconapp CPAREN { case $2 of (tc,tys) -> MonoTyApp tc tys }
+ | OPAREN type COMMA types CPAREN { MonoTupleTy ($2:$4) }
+ | OBRACK type CBRACK { MonoListTy $2 }
+ | OPAREN btype RARROW type CPAREN { MonoFunTy $2 $4 }
+
+tyvar_list :: { [FAST_STRING] }
+tyvar_list : VARID { [$1] }
+ | tyvar_list COMMA VARID { $1 ++ [$3]
+--------------------------------------------------------------------------
+ }
+
+pragmas_part :: { LocalPragmasMap }
+pragmas_part : PRAGMAS_PART
{ emptyFM }
+ | { emptyFM }
{
------------------------------------------------------------------
-happyError :: Int -> [IfaceToken] -> a
-happyError i _ = error ("Parse error in line " ++ show i ++ "\n")
-
------------------------------------------------------------------
-data IfaceToken
- = ITinterface -- keywords
- | ITversions
- | ITexports
- | ITinstance_modules
- | ITinstances
- | ITdeclarations
- | ITpragmas
- | ITdata
- | ITtype
- | ITnewtype
- | ITclass
- | ITwhere
- | ITinstance
- | ITbar -- magic symbols
- | ITcolons
- | ITcomma
- | ITdblrarrow
- | ITdot
- | ITdotdot
- | ITequal
- | ITlbrace
- | ITlbrack
- | ITlparen
- | ITrarrow
- | ITrbrace
- | ITrbrack
- | ITrparen
- | ITsemicolon
- | ITnum Integer -- numbers and names
- | ITname FAST_STRING
-
------------------------------------------------------------------
-lexIface :: String -> [IfaceToken]
-
-lexIface str
- = case str of
- [] -> []
-
- -- whitespace and comments
- ' ' : cs -> lexIface cs
- '\t' : cs -> lexIface cs
- '\n' : cs -> lexIface cs
- '-' : '-' : cs -> lex_comment cs
- '{' : '-' : cs -> lex_nested_comment 1{-one seen-} cs
-
- '(' : '.' : '.' : ')' : cs -> ITdotdot : lexIface cs
- '(' : cs -> ITlparen : lexIface cs
- ')' : cs -> ITrparen : lexIface cs
- '[' : cs -> ITlbrack : lexIface cs
- ']' : cs -> ITrbrack : lexIface cs
- '{' : cs -> ITlbrace : lexIface cs
- '}' : cs -> ITrbrace : lexIface cs
- '-' : '>' : cs -> ITrarrow : lexIface cs
- '.' : cs -> ITdot : lexIface cs
- '|' : cs -> ITbar : lexIface cs
- ':' : ':' : cs -> ITcolons : lexIface cs
- '=' : '>' : cs -> ITdblrarrow : lexIface cs
- '=' : cs -> ITequal : lexIface cs
- ',' : cs -> ITcomma : lexIface cs
- ';' : cs -> ITsemicolon : lexIface cs
-
- '_' : cs -> lex_word str
- c : cs | isDigit c -> lex_num str
- | isAlpha c -> lex_word str
-
- other -> error ("lexing:"++other)
- where
- lex_comment str
- = case (span ((/=) '\n') str) of { (junk, rest) ->
- lexIface rest }
-
- lex_nested_comment lvl [] = error "EOF in nested comment in interface"
- lex_nested_comment lvl str
- = case str of
- '{' : '-' : xs -> lex_nested_comment (lvl+1) xs
- '-' : '}' : xs -> if lvl == 1
- then lexIface xs
- else lex_nested_comment (lvl-1) xs
- _ : xs -> lex_nested_comment lvl xs
-
- lex_num str
- = case (span isDigit str) of { (num, rest) ->
- ITnum (read num) : lexIface rest }
-
- lex_word str
- = case (span is_word_sym str) of { (word, rest) ->
- case (lookupFM keywordsFM word) of {
- Nothing -> ITname (_PK_ word) : lexIface rest ;
- Just xx -> xx : lexIface rest
- }}
- where
- is_word_sym '_' = True
- is_word_sym c = isAlphanum c
-
- keywordsFM :: FiniteMap String IfaceToken
- keywordsFM = listToFM [
- ("interface", ITinterface)
-
- ,("__versions__", ITversions)
- ,("__exports__", ITexports)
- ,("__instance_modules__", ITinstance_modules)
- ,("__instances__", ITinstances)
- ,("__declarations__", ITdeclarations)
- ,("__pragmas__", ITpragmas)
-
- ,("data", ITdata)
- ,("class", ITclass)
- ,("where", ITwhere)
- ,("instance", ITinstance)
- ]
}