X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Fmain%2FParsePkgConf.y;h=beb6e540e72cb95ea687e44bf629dbf852199cf3;hb=b45779d16382c86ece0fbfae6bbdd99a1eae6965;hp=e9161113e65b08a9823c726ba3dd5950c16ce329;hpb=b3e4cb91c4386c4d1456b896da1abb964f2124a6;p=ghc-hetmet.git diff --git a/ghc/compiler/main/ParsePkgConf.y b/ghc/compiler/main/ParsePkgConf.y index e916111..beb6e54 100644 --- a/ghc/compiler/main/ParsePkgConf.y +++ b/ghc/compiler/main/ParsePkgConf.y @@ -4,9 +4,11 @@ module ParsePkgConf( loadPackageConfig ) where #include "HsVersions.h" import Packages ( PackageConfig(..), defaultPackageConfig ) -import Lex +import Lexer +import CmdLineOpts import FastString import StringBuffer +import ErrUtils ( mkLocMessage ) import SrcLoc import Outputable import Panic ( GhcException(..) ) @@ -15,20 +17,20 @@ 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 :: { [ PackageConfig ] } @@ -49,9 +51,14 @@ fields :: { PackageConfig -> PackageConfig } field :: { PackageConfig -> PackageConfig } : VARID '=' STRING {% case unpackFS $1 of { - "name" -> returnP (\ p -> p{name = unpackFS $3}); + "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} @@ -77,24 +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) +happyError = srcParseFail loadPackageConfig :: FilePath -> IO [PackageConfig] loadPackageConfig conf_filename = do buf <- hGetStringBuffer conf_filename - let loc = mkSrcLoc (mkFastString conf_filename) 1 - exts = ExtFlags {glasgowExtsEF = False, - ffiEF = False, - withEF = False, - parrEF = False} - case parse buf (mkPState loc exts) of - PFailed err -> do - freeStringBuffer buf - throwDyn (InstallationError (showSDoc err)) + 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 pkg_details }