beb6e540e72cb95ea687e44bf629dbf852199cf3
[ghc-hetmet.git] / ghc / compiler / main / ParsePkgConf.y
1 {
2 module ParsePkgConf( loadPackageConfig ) where
3
4 #include "HsVersions.h"
5
6 import Packages  ( PackageConfig(..), defaultPackageConfig )
7 import Lexer
8 import CmdLineOpts
9 import FastString
10 import StringBuffer
11 import ErrUtils  ( mkLocMessage )
12 import SrcLoc
13 import Outputable
14 import Panic     ( GhcException(..) )
15 import EXCEPTION ( throwDyn )
16
17 }
18
19 %token
20  '{'            { L _ ITocurly }
21  '}'            { L _ ITccurly }
22  '['            { L _ ITobrack }
23  ']'            { L _ ITcbrack }
24  ','            { L _ ITcomma }
25  '='            { L _ ITequal }
26  VARID          { L _ (ITvarid    $$) }
27  CONID          { L _ (ITconid    $$) }
28  STRING         { L _ (ITstring   $$) }
29
30 %monad { P } { >>= } { return }
31 %lexer { lexer } { L _ ITeof }
32 %name parse
33 %tokentype { Located Token }
34 %%
35
36 pkgconf :: { [ PackageConfig ] }
37         : '[' ']'                       { [] }
38         | '[' pkgs ']'                  { reverse $2 }
39
40 pkgs    :: { [ PackageConfig ] }
41         : pkg                           { [ $1 ] }
42         | pkgs ',' pkg                  { $3 : $1 }
43
44 pkg     :: { PackageConfig }
45         : CONID '{' fields '}'          { $3 defaultPackageConfig }
46
47 fields  :: { PackageConfig -> PackageConfig }
48         : field                         { \p -> $1 p }
49         | fields ',' field              { \p -> $1 ($3 p) }
50
51 field   :: { PackageConfig -> PackageConfig }
52         : VARID '=' STRING              
53                  {% case unpackFS $1 of { 
54                    "name" -> return (\ p -> p{name = unpackFS $3});
55                    _      -> happyError } }
56                         
57         | VARID '=' bool
58                 {\p -> case unpackFS $1 of {
59                         "auto" -> p{auto = $3};
60                         _      -> p } }
61
62         | VARID '=' strlist             
63                 {\p -> case unpackFS $1 of
64                         "import_dirs"     -> p{import_dirs     = $3}
65                         "library_dirs"    -> p{library_dirs    = $3}
66                         "hs_libraries"    -> p{hs_libraries    = $3}
67                         "extra_libraries" -> p{extra_libraries = $3}
68                         "include_dirs"    -> p{include_dirs    = $3}
69                         "c_includes"      -> p{c_includes      = $3}
70                         "package_deps"    -> p{package_deps    = $3}
71                         "extra_ghc_opts"  -> p{extra_ghc_opts  = $3}
72                         "extra_cc_opts"   -> p{extra_cc_opts   = $3}
73                         "extra_ld_opts"   -> p{extra_ld_opts   = $3}
74                         "framework_dirs"  -> p{framework_dirs  = $3}
75                         "extra_frameworks"-> p{extra_frameworks= $3}
76                         _other            -> p
77                 }
78
79 strlist :: { [String] }
80         : '[' ']'                       { [] }
81         | '[' strs ']'                  { reverse $2 }
82
83 strs    :: { [String] }
84         : STRING                        { [ unpackFS $1 ] }
85         | strs ',' STRING               { unpackFS $3 : $1 }
86
87 bool    :: { Bool }
88         : CONID                         {% case unpackFS $1 of {
89                                             "True"  -> return True;
90                                             "False" -> return False;
91                                             _       -> happyError } }
92
93 {
94 happyError :: P a
95 happyError = srcParseFail
96
97 loadPackageConfig :: FilePath -> IO [PackageConfig]
98 loadPackageConfig conf_filename = do
99    buf <- hGetStringBuffer conf_filename
100    let loc  = mkSrcLoc (mkFastString conf_filename) 1 0
101    case unP parse (mkPState buf loc defaultDynFlags) of
102         PFailed span err -> 
103            throwDyn (InstallationError (showSDoc (mkLocMessage span err)))
104
105         POk _ pkg_details -> do
106             return pkg_details
107 }