[project @ 2003-12-10 14:15:16 by simonmar]
[ghc-hetmet.git] / ghc / compiler / main / ParsePkgConf.y
index a3e569d..beb6e54 100644 (file)
@@ -1,50 +1,64 @@
 {
-module ParsePkgConf (parsePkgConf) where
-import CmStaticInfo
-import Lex
+module ParsePkgConf( loadPackageConfig ) where
+
+#include "HsVersions.h"
+
+import Packages  ( PackageConfig(..), defaultPackageConfig )
+import Lexer
+import CmdLineOpts
 import FastString
 import StringBuffer
+import ErrUtils  ( mkLocMessage )
 import SrcLoc
 import Outputable
-#include "HsVersions.h"
+import Panic     ( GhcException(..) )
+import EXCEPTION ( throwDyn )
+
 }
 
 %token
- '{'           { ITocurly }
- '}'           { ITccurly }
- '['           { ITobrack }
- ']'           { ITcbrack }
- ','           { ITcomma }
- '='           { ITequal }
- VARID         { ITvarid    $$ }
- CONID         { ITconid    $$ }
- STRING                { ITstring   $$ }
-
-%monad { P } { thenP } { returnP }
-%lexer { lexer } { ITeof }
+ '{'           { L _ ITocurly }
+ '}'           { L _ ITccurly }
+ '['           { L _ ITobrack }
+ ']'           { L _ ITcbrack }
+ ','           { L _ ITcomma }
+ '='           { L _ ITequal }
+ VARID         { L _ (ITvarid    $$) }
+ CONID         { L _ (ITconid    $$) }
+ STRING                { L _ (ITstring   $$) }
+
+%monad { P } { >>= } { return }
+%lexer { lexer } { L _ ITeof }
 %name parse
-%tokentype { Token }
+%tokentype { Located Token }
 %%
 
-pkgconf :: { [ Package ] }
-       : '[' pkgs ']'                  { reverse $2 }
+pkgconf :: { [ PackageConfig ] }
+       : '[' ']'                       { [] }
+       | '[' pkgs ']'                  { reverse $2 }
 
-pkgs   :: { [ Package ] }
+pkgs   :: { [ PackageConfig ] }
        : pkg                           { [ $1 ] }
        | pkgs ',' pkg                  { $3 : $1 }
 
-pkg    :: { Package }
-       : CONID '{' fields '}'          { $3 defaultPackage }
+pkg    :: { PackageConfig }
+       : CONID '{' fields '}'          { $3 defaultPackageConfig }
 
-fields  :: { Package -> Package }
+fields  :: { PackageConfig -> PackageConfig }
        : field                         { \p -> $1 p }
        | fields ',' field              { \p -> $1 ($3 p) }
 
-field  :: { Package -> Package }
+field  :: { PackageConfig -> PackageConfig }
        : VARID '=' STRING              
-               {\p -> case unpackFS $1 of
-                       "name" -> p{name = unpackFS $3} }
+                 {% case unpackFS $1 of { 
+                  "name" -> return (\ p -> p{name = unpackFS $3});
+                  _      -> happyError } }
                        
+        | VARID '=' bool
+               {\p -> case unpackFS $1 of {
+                       "auto" -> p{auto = $3};
+                       _      -> p } }
+
        | VARID '=' strlist             
                {\p -> case unpackFS $1 of
                        "import_dirs"     -> p{import_dirs     = $3}
@@ -57,6 +71,8 @@ field :: { Package -> Package }
                        "extra_ghc_opts"  -> p{extra_ghc_opts  = $3}
                        "extra_cc_opts"   -> p{extra_cc_opts   = $3}
                        "extra_ld_opts"   -> p{extra_ld_opts   = $3}
+                       "framework_dirs"  -> p{framework_dirs  = $3}
+                       "extra_frameworks"-> p{extra_frameworks= $3}
                        _other            -> p
                }
 
@@ -68,21 +84,24 @@ strs        :: { [String] }
        : STRING                        { [ unpackFS $1 ] }
        | strs ',' STRING               { unpackFS $3 : $1 }
 
+bool    :: { Bool }
+       : CONID                         {% case unpackFS $1 of {
+                                           "True"  -> return True;
+                                           "False" -> return False;
+                                           _       -> happyError } }
+
 {
 happyError :: P a
-happyError buf PState{ loc = loc } = PFailed (srcParseErr buf loc)
-
-parsePkgConf :: FilePath -> IO (Either SDoc [Package])
-parsePkgConf conf_filename = do
-   buf <- hGetStringBuffer False conf_filename
-   case parse buf PState{ bol = 0#, atbol = 1#,
-                         context = [], glasgow_exts = 0#,
-                         loc = mkSrcLoc (_PK_ conf_filename) 1 } of
-       PFailed err -> do
-           freeStringBuffer buf
-            return (Left err)
+happyError = srcParseFail
+
+loadPackageConfig :: FilePath -> IO [PackageConfig]
+loadPackageConfig conf_filename = do
+   buf <- hGetStringBuffer conf_filename
+   let loc  = mkSrcLoc (mkFastString conf_filename) 1 0
+   case unP parse (mkPState buf loc defaultDynFlags) of
+       PFailed span err -> 
+           throwDyn (InstallationError (showSDoc (mkLocMessage span err)))
 
        POk _ pkg_details -> do
-           freeStringBuffer buf
-           return (Right pkg_details)
+           return pkg_details
 }