X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Fmain%2FParsePkgConf.y;h=901a5bc94335b871c41fcc8be349ba4cfd54b02f;hb=28a464a75e14cece5db40f2765a29348273ff2d2;hp=f83dd58d1e7728586bdd0198fb2ab7ec9c2be56b;hpb=16e4ce4c0c02650082f2e11982017c903c549ad5;p=ghc-hetmet.git diff --git a/ghc/compiler/main/ParsePkgConf.y b/ghc/compiler/main/ParsePkgConf.y index f83dd58..901a5bc 100644 --- a/ghc/compiler/main/ParsePkgConf.y +++ b/ghc/compiler/main/ParsePkgConf.y @@ -3,10 +3,12 @@ module ParsePkgConf( loadPackageConfig ) where #include "HsVersions.h" -import Packages ( PackageConfig(..), defaultPackageConfig ) -import Lex +import PackageConfig +import Lexer +import DynFlags import FastString import StringBuffer +import ErrUtils ( mkLocMessage ) import SrcLoc import Outputable import Panic ( GhcException(..) ) @@ -15,20 +17,21 @@ 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 $$) } + INT { L _ (ITinteger $$) } + +%monad { P } { >>= } { return } +%lexer { lexer } { L _ ITeof } %name parse -%tokentype { Token } +%tokentype { Located Token } %% pkgconf :: { [ PackageConfig ] } @@ -47,66 +50,104 @@ fields :: { PackageConfig -> PackageConfig } | fields ',' field { \p -> $1 ($3 p) } field :: { PackageConfig -> PackageConfig } - : VARID '=' STRING - {% case unpackFS $1 of { - "name" -> returnP (\ p -> p{name = unpackFS $3}); - _ -> happyError } } + : VARID '=' pkgid + {% case unpackFS $1 of + "package" -> return (\p -> p{package = $3}) + _other -> happyError + } + + | VARID '=' STRING { id } + -- we aren't interested in the string fields, they're all + -- boring (copyright, maintainer etc.) - | VARID '=' bool - {\p -> case unpackFS $1 of { - "auto" -> p{auto = $3}; - _ -> p } } + | VARID '=' CONID + {% case unpackFS $1 of { + "exposed" -> + case unpackFS $3 of { + "True" -> return (\p -> p{exposed=True}); + "False" -> return (\p -> p{exposed=False}); + _ -> happyError }; + "license" -> return id; -- not interested + _ -> happyError } + } + + | VARID '=' CONID STRING { id } + -- another case of license | VARID '=' strlist {\p -> case unpackFS $1 of - "import_dirs" -> p{import_dirs = $3} - "library_dirs" -> p{library_dirs = $3} - "hs_libraries" -> p{hs_libraries = $3} - "extra_libraries" -> p{extra_libraries = $3} - "include_dirs" -> p{include_dirs = $3} - "c_includes" -> p{c_includes = $3} - "package_deps" -> p{package_deps = $3} - "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 + "exposedModules" -> p{exposedModules = $3} + "hiddenModules" -> p{hiddenModules = $3} + "importDirs" -> p{importDirs = $3} + "libraryDirs" -> p{libraryDirs = $3} + "hsLibraries" -> p{hsLibraries = $3} + "extraLibraries" -> p{extraLibraries = $3} + "extraGHCiLibraries"-> p{extraGHCiLibraries= $3} + "includeDirs" -> p{includeDirs = $3} + "includes" -> p{includes = $3} + "hugsOptions" -> p{hugsOptions = $3} + "ccOptions" -> p{ccOptions = $3} + "ldOptions" -> p{ldOptions = $3} + "frameworkDirs" -> p{frameworkDirs = $3} + "frameworks" -> p{frameworks = $3} + "haddockInterfaces" -> p{haddockInterfaces = $3} + "haddockHTMLs" -> p{haddockHTMLs = $3} + "depends" -> p{depends = []} + -- empty list only, non-empty handled below + other -> p } + | VARID '=' pkgidlist + {% case unpackFS $1 of + "depends" -> return (\p -> p{depends = $3}) + _other -> happyError + } + +pkgid :: { PackageIdentifier } + : CONID '{' VARID '=' STRING ',' VARID '=' version '}' + { PackageIdentifier{ pkgName = unpackFS $5, + pkgVersion = $9 } } + +version :: { Version } + : CONID '{' VARID '=' intlist ',' VARID '=' strlist '}' + { Version{ versionBranch=$5, versionTags=$9 } } + +pkgidlist :: { [PackageIdentifier] } + : '[' pkgids ']' { $2 } + -- empty list case is covered by strlist, to avoid conflicts + +pkgids :: { [PackageIdentifier] } + : pkgid { [ $1 ] } + | pkgid ',' pkgids { $1 : $3 } + +intlist :: { [Int] } + : '[' ']' { [] } + | '[' ints ']' { $2 } + +ints :: { [Int] } + : INT { [ fromIntegral $1 ] } + | INT ',' ints { fromIntegral $1 : $3 } + strlist :: { [String] } : '[' ']' { [] } - | '[' strs ']' { reverse $2 } + | '[' strs ']' { $2 } strs :: { [String] } : STRING { [ unpackFS $1 ] } - | strs ',' STRING { unpackFS $3 : $1 } - -bool :: { Bool } - : CONID {% case unpackFS $1 of { - "True" -> returnP True; - "False" -> returnP False; - _ -> happyError } } + | STRING ',' strs { unpackFS $1 : $3 } { 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, - arrowsEF = 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 }