blob: fddd594e8e7e8fa8fff48fd4c10dd4e5c62d4466 (
plain)
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
|
-- | Parsers for unit/module identifiers
module GHC.Unit.Parser
( parseUnit
, parseIndefUnitId
, parseHoleyModule
, parseModSubst
)
where
import GHC.Prelude
import GHC.Unit.Types
import GHC.Unit.Module.Name
import GHC.Data.FastString
import qualified Text.ParserCombinators.ReadP as Parse
import Text.ParserCombinators.ReadP (ReadP, (<++))
import Data.Char (isAlphaNum)
parseUnit :: ReadP Unit
parseUnit = parseVirtUnitId <++ parseDefUnitId
where
parseVirtUnitId = do
uid <- parseIndefUnitId
insts <- parseModSubst
return (mkVirtUnit uid insts)
parseDefUnitId = do
s <- parseUnitId
return (RealUnit (Definite s))
parseUnitId :: ReadP UnitId
parseUnitId = do
s <- Parse.munch1 (\c -> isAlphaNum c || c `elem` "-_.+")
return (UnitId (mkFastString s))
parseIndefUnitId :: ReadP IndefUnitId
parseIndefUnitId = do
uid <- parseUnitId
return (Indefinite uid)
parseHoleyModule :: ReadP Module
parseHoleyModule = parseModuleVar <++ parseModule
where
parseModuleVar = do
_ <- Parse.char '<'
modname <- parseModuleName
_ <- Parse.char '>'
return (Module HoleUnit modname)
parseModule = do
uid <- parseUnit
_ <- Parse.char ':'
modname <- parseModuleName
return (Module uid modname)
parseModSubst :: ReadP [(ModuleName, Module)]
parseModSubst = Parse.between (Parse.char '[') (Parse.char ']')
. flip Parse.sepBy (Parse.char ',')
$ do k <- parseModuleName
_ <- Parse.char '='
v <- parseHoleyModule
return (k, v)
|