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