[project @ 2001-03-12 14:06:46 by simonpj]
[ghc-hetmet.git] / ghc / compiler / main / ParsePkgConf.y
1 {
2 module ParsePkgConf (parsePkgConf) where
3 import CmStaticInfo
4 import Lex
5 import FastString
6 import StringBuffer
7 import SrcLoc
8 import Outputable
9 #include "HsVersions.h"
10 }
11
12 %token
13  '{'            { ITocurly }
14  '}'            { ITccurly }
15  '['            { ITobrack }
16  ']'            { ITcbrack }
17  ','            { ITcomma }
18  '='            { ITequal }
19  VARID          { ITvarid    $$ }
20  CONID          { ITconid    $$ }
21  STRING         { ITstring   $$ }
22
23 %monad { P } { thenP } { returnP }
24 %lexer { lexer } { ITeof }
25 %name parse
26 %tokentype { Token }
27 %%
28
29 pkgconf :: { [ PackageConfig ] }
30         : '[' pkgs ']'                  { reverse $2 }
31
32 pkgs    :: { [ PackageConfig ] }
33         : pkg                           { [ $1 ] }
34         | pkgs ',' pkg                  { $3 : $1 }
35
36 pkg     :: { PackageConfig }
37         : CONID '{' fields '}'          { $3 defaultPackageConfig }
38
39 fields  :: { PackageConfig -> PackageConfig }
40         : field                         { \p -> $1 p }
41         | fields ',' field              { \p -> $1 ($3 p) }
42
43 field   :: { PackageConfig -> PackageConfig }
44         : VARID '=' STRING              
45                 {\p -> case unpackFS $1 of
46                         "name" -> p{name = unpackFS $3} }
47                         
48         | VARID '=' strlist             
49                 {\p -> case unpackFS $1 of
50                         "import_dirs"     -> p{import_dirs     = $3}
51                         "library_dirs"    -> p{library_dirs    = $3}
52                         "hs_libraries"    -> p{hs_libraries    = $3}
53                         "extra_libraries" -> p{extra_libraries = $3}
54                         "include_dirs"    -> p{include_dirs    = $3}
55                         "c_includes"      -> p{c_includes      = $3}
56                         "package_deps"    -> p{package_deps    = $3}
57                         "extra_ghc_opts"  -> p{extra_ghc_opts  = $3}
58                         "extra_cc_opts"   -> p{extra_cc_opts   = $3}
59                         "extra_ld_opts"   -> p{extra_ld_opts   = $3}
60                         _other            -> p
61                 }
62
63 strlist :: { [String] }
64         : '[' ']'                       { [] }
65         | '[' strs ']'                  { reverse $2 }
66
67 strs    :: { [String] }
68         : STRING                        { [ unpackFS $1 ] }
69         | strs ',' STRING               { unpackFS $3 : $1 }
70
71 {
72 happyError :: P a
73 happyError buf PState{ loc = loc } = PFailed (srcParseErr buf loc)
74
75 parsePkgConf :: FilePath -> IO (Either SDoc [PackageConfig])
76 parsePkgConf conf_filename = do
77    buf <- hGetStringBuffer False conf_filename
78    case parse buf PState{ bol = 0#, atbol = 1#,
79                           context = [], glasgow_exts = 0#,
80                           loc = mkSrcLoc (_PK_ conf_filename) 1 } of
81         PFailed err -> do
82             freeStringBuffer buf
83             return (Left err)
84
85         POk _ pkg_details -> do
86             freeStringBuffer buf
87             return (Right pkg_details)
88 }