X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;ds=sidebyside;f=ghc%2Fcompiler%2Fmain%2FParsePkgConf.y;h=abbbcea1eb31107f16eb8ca029c976cc60b26b15;hb=d255dfff87648bcd4dd1d87faa8d835d358c70a2;hp=1a8f9db33281e8c6fed2e5267865a5fd5f7c9981;hpb=9fdd90b00f159463165f739c44943e53fb553c19;p=ghc-hetmet.git diff --git a/ghc/compiler/main/ParsePkgConf.y b/ghc/compiler/main/ParsePkgConf.y index 1a8f9db..abbbcea 100644 --- a/ghc/compiler/main/ParsePkgConf.y +++ b/ghc/compiler/main/ParsePkgConf.y @@ -1,33 +1,40 @@ { -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 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 } + '{' { T _ _ ITocurly } + '}' { T _ _ ITccurly } + '[' { T _ _ ITobrack } + ']' { T _ _ ITcbrack } + ',' { T _ _ ITcomma } + '=' { T _ _ ITequal } + VARID { T _ _ (ITvarid $$) } + CONID { T _ _ (ITconid $$) } + STRING { T _ _ (ITstring $$) } + +%monad { P } { >>= } { return } +%lexer { lexer } { T _ _ ITeof } %name parse %tokentype { Token } %% pkgconf :: { [ PackageConfig ] } - : '[' pkgs ']' { reverse $2 } + : '[' ']' { [] } + | '[' pkgs ']' { reverse $2 } pkgs :: { [ PackageConfig ] } : pkg { [ $1 ] } @@ -42,9 +49,15 @@ fields :: { PackageConfig -> PackageConfig } 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 +70,8 @@ field :: { PackageConfig -> PackageConfig } "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 +83,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 [PackageConfig]) -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 l1 l2 err -> + throwDyn (InstallationError (showSDoc (showPFailed l1 l2 err))) POk _ pkg_details -> do - freeStringBuffer buf - return (Right pkg_details) + return pkg_details }