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