| Opt_PArr -- syntactic support for parallel arrays
| Opt_With -- deprecated keyword for implicit parms
| Opt_Arrows -- Arrow-notation syntax
+ | Opt_TH
+ | Opt_ImplicitParams
| Opt_Generics
| Opt_NoImplicitPrelude
-----------------------------------------------------------------------------
--- $Id: DriverFlags.hs,v 1.123 2003/09/04 11:08:47 simonmar Exp $
+-- $Id: DriverFlags.hs,v 1.124 2003/09/10 16:44:05 simonmar Exp $
--
-- Driver flags
--
, ( "fvia-C", NoArg (setLang HscC) )
, ( "filx", NoArg (setLang HscILX) )
+ , ( "fglasgow-exts", NoArg (mapM_ setDynFlag glasgowExtsFlags) )
+ , ( "fno-glasgow-exts", NoArg (mapM_ unSetDynFlag glasgowExtsFlags) )
+
-- "active negatives"
, ( "fno-implicit-prelude", NoArg (setDynFlag Opt_NoImplicitPrelude) )
, ( "fno-monomorphism-restriction",
( "warn-unused-imports", Opt_WarnUnusedImports ),
( "warn-unused-matches", Opt_WarnUnusedMatches ),
( "warn-deprecations", Opt_WarnDeprecations ),
- ( "glasgow-exts", Opt_GlasgowExts ),
( "fi", Opt_FFI ), -- support `-ffi'...
( "ffi", Opt_FFI ), -- ...and also `-fffi'
( "with", Opt_With ), -- with keyword
( "arrows", Opt_Arrows ), -- arrow syntax
( "parr", Opt_PArr ),
+ ( "th", Opt_TH ),
+ ( "implicit-params", Opt_ImplicitParams ),
( "allow-overlapping-instances", Opt_AllowOverlappingInstances ),
( "allow-undecidable-instances", Opt_AllowUndecidableInstances ),
( "allow-incoherent-instances", Opt_AllowIncoherentInstances ),
( "generics", Opt_Generics )
]
+glasgowExtsFlags = [ Opt_GlasgowExts, Opt_FFI, Opt_TH, Opt_ImplicitParams ]
+
isFFlag f = f `elem` (map fst fFlags)
getFFlag f = fromJust (lookup f fFlags)
import RdrName ( nameRdrName )
import StringBuffer ( hGetStringBuffer )
import Parser
-import Lexer ( P(..), ParseResult(..), ExtFlags(..),
- mkPState, showPFailed )
+import Lexer ( P(..), ParseResult(..), mkPState, showPFailed )
import SrcLoc ( mkSrcLoc )
import TcRnDriver ( checkOldIface, tcRnModule, tcRnExtCore, tcRnIface )
import RnEnv ( extendOrigNameCache )
_scc_ "Parser" do
buf <- hGetStringBuffer src_filename
- let exts = mkExtFlags dflags
- loc = mkSrcLoc (mkFastString src_filename) 1 0
+ let loc = mkSrcLoc (mkFastString src_filename) 1 0
- case unP parseModule (mkPState buf loc exts) of {
+ case unP parseModule (mkPState buf loc dflags) of {
PFailed l1 l2 err -> do { hPutStrLn stderr (showPFailed l1 l2 err);
return Nothing };
buf <- stringToStringBuffer str
- let exts = mkExtFlags dflags
- loc = mkSrcLoc FSLIT("<interactive>") 1 0
+ let loc = mkSrcLoc FSLIT("<interactive>") 1 0
- case unP parseStmt (mkPState buf loc exts) of {
+ case unP parseStmt (mkPState buf loc dflags) of {
PFailed l1 l2 err -> do { hPutStrLn stderr (showPFailed l1 l2 err);
return Nothing };
myParseIdentifier dflags str
= do buf <- stringToStringBuffer str
- let exts = mkExtFlags dflags
- loc = mkSrcLoc FSLIT("<interactive>") 1 0
-
- case unP parseIdentifier (mkPState buf loc exts) of
+ let loc = mkSrcLoc FSLIT("<interactive>") 1 0
+ case unP parseIdentifier (mkPState buf loc dflags) of
PFailed l1 l2 err -> do { hPutStrLn stderr (showPFailed l1 l2 err);
return Nothing }
initOrigNames :: OrigNameCache
initOrigNames = foldl extendOrigNameCache emptyModuleEnv knownKeyNames
-
-mkExtFlags dflags
- = ExtFlags { glasgowExtsEF = dopt Opt_GlasgowExts dflags,
- ffiEF = dopt Opt_FFI dflags,
- withEF = dopt Opt_With dflags,
- arrowsEF = dopt Opt_Arrows dflags,
- parrEF = dopt Opt_PArr dflags}
\end{code}
import Packages ( PackageConfig(..), defaultPackageConfig )
import Lexer
+import CmdLineOpts
import FastString
import StringBuffer
import SrcLoc
loadPackageConfig conf_filename = do
buf <- hGetStringBuffer conf_filename
let loc = mkSrcLoc (mkFastString conf_filename) 1 0
- exts = ExtFlags {glasgowExtsEF = False,
- ffiEF = False,
- arrowsEF = False,
- withEF = False,
- parrEF = False}
- case unP parse (mkPState buf loc exts) of
+ case unP parse (mkPState buf loc defaultDynFlags) of
PFailed l1 l2 err -> do
throwDyn (InstallationError (showPFailed l1 l2 err))
{
module Lexer (
- Token(..), Token__(..), lexer, ExtFlags(..), mkPState, showPFailed,
+ Token(..), Token__(..), lexer, mkPState, showPFailed,
P(..), ParseResult(..), setSrcLocFor, getSrcLoc,
failMsgP, failLocMsgP, srcParseFail,
popContext, pushCurrentContext,
import FastTypes
import SrcLoc
import UniqFM
+import CmdLineOpts
import Ctype
import Util ( maybePrefixMatch )
-- "special" symbols
+<0,glaexts> {
+ "[:" / { ifExtension parrEnabled } { token ITopabrack }
+ ":]" / { ifExtension parrEnabled } { token ITcpabrack }
+}
+
+<0,glaexts> {
+ "[|" / { ifExtension thEnabled } { token ITopenExpQuote }
+ "[e|" / { ifExtension thEnabled } { token ITopenExpQuote }
+ "[p|" / { ifExtension thEnabled } { token ITopenPatQuote }
+ "[d|" / { ifExtension thEnabled } { layout_token ITopenDecQuote }
+ "[t|" / { ifExtension thEnabled } { token ITopenTypQuote }
+ "|]" / { ifExtension thEnabled } { token ITcloseQuote }
+ \$ @varid / { ifExtension thEnabled } { skip_one_varid ITidEscape }
+ "$(" / { ifExtension thEnabled } { token ITparenEscape }
+}
+
+<0,glaexts> {
+ "(|" / { ifExtension arrowsEnabled } { special IToparenbar }
+ "|)" / { ifExtension arrowsEnabled } { special ITcparenbar }
+}
+
+<0,glaexts> {
+ \? @varid / { ifExtension ipEnabled } { skip_one_varid ITdupipvarid }
+ \% @varid / { ifExtension ipEnabled } { skip_one_varid ITsplitipvarid }
+}
+
<glaexts> {
"(#" { token IToubxparen }
"#)" { token ITcubxparen }
-
- "[:" { token ITopabrack }
- ":]" { token ITcpabrack }
-
"{|" { token ITocurlybar }
"|}" { token ITccurlybar }
-
- "[|" { token ITopenExpQuote }
- "[e|" { token ITopenExpQuote }
- "[p|" { token ITopenPatQuote }
- "[d|" { layout_token ITopenDecQuote }
- "[t|" { token ITopenTypQuote }
- "|]" { token ITcloseQuote }
}
<0,glaexts> {
- "(|" / { \b _ _ _ -> arrowsEnabled b} { special IToparenbar }
- "|)" / { \b _ _ _ -> arrowsEnabled b} { special ITcparenbar }
\( { special IToparen }
\) { special ITcparen }
\[ { special ITobrack }
\} { close_brace }
}
-<glaexts> {
- \? @varid { skip_one_varid ITdupipvarid }
- \% @varid { skip_one_varid ITsplitipvarid }
- \$ @varid { skip_one_varid ITidEscape }
- "$(" { token ITparenEscape }
-}
-
<0,glaexts> {
@qual @varid { check_qvarid }
@qual @conid { idtoken qconid }
notFollowedBy char _ _ _ (_,buf) = atEnd buf || currentChar buf /= char
+ifExtension pred bits _ _ _ = pred bits
+
{-
nested comments require traversing by hand, they can't be parsed
using regular expressions.
parrBit = 2
withBit = 3
arrowsBit = 4
+thBit = 5
+ipBit = 6
glaExtsEnabled, ffiEnabled, parrEnabled :: Int -> Bool
glaExtsEnabled flags = testBit flags glaExtsBit
withEnabled flags = testBit flags withBit
parrEnabled flags = testBit flags parrBit
arrowsEnabled flags = testBit flags arrowsBit
-
--- convenient record-based bitmap for the interface to the rest of the world
---
--- NB: `glasgowExtsEF' implies `ffiEF' (see `mkPState' below)
---
-data ExtFlags = ExtFlags {
- glasgowExtsEF :: Bool,
- ffiEF :: Bool,
- withEF :: Bool,
- parrEF :: Bool,
- arrowsEF :: Bool
- }
+thEnabled flags = testBit flags thBit
+ipEnabled flags = testBit flags ipBit
-- create a parse state
--
-mkPState :: StringBuffer -> SrcLoc -> ExtFlags -> PState
-mkPState buf loc exts =
+mkPState :: StringBuffer -> SrcLoc -> DynFlags -> PState
+mkPState buf loc flags =
PState {
buffer = buf,
last_loc = loc,
-- we begin in the layout state if toplev_layout is set
}
where
- bitmap = glaExtsBit `setBitIf` glasgowExtsEF exts
- .|. ffiBit `setBitIf` (ffiEF exts
- || glasgowExtsEF exts)
- .|. withBit `setBitIf` withEF exts
- .|. parrBit `setBitIf` parrEF exts
- .|. arrowsBit `setBitIf` arrowsEF exts
+ bitmap = glaExtsBit `setBitIf` dopt Opt_GlasgowExts flags
+ .|. ffiBit `setBitIf` dopt Opt_FFI flags
+ .|. withBit `setBitIf` dopt Opt_With flags
+ .|. parrBit `setBitIf` dopt Opt_PArr flags
+ .|. arrowsBit `setBitIf` dopt Opt_Arrows flags
+ .|. thBit `setBitIf` dopt Opt_TH flags
+ .|. ipBit `setBitIf` dopt Opt_ImplicitParams flags
--
setBitIf :: Int -> Bool -> Int
b `setBitIf` cond | cond = bit b
-- Just x <=> successfully found and parsed
readIface mod file_path is_hi_boot_file
- = ioToTcRn (tryMost (read_iface mod file_path is_hi_boot_file))
+ = do dflags <- getDOpts
+ ioToTcRn (tryMost (read_iface mod dflags file_path is_hi_boot_file))
-read_iface mod file_path is_hi_boot_file
+read_iface mod dflags file_path is_hi_boot_file
| is_hi_boot_file -- Read ascii
= do { buffer <- hGetStringBuffer file_path ;
- case unP parseIface (mkPState buffer loc exts) of
+ case unP parseIface (mkPState buffer loc dflags) of
POk _ iface | wanted_mod_name == actual_mod_name
-> return iface
| otherwise
= readBinIface file_path
where
- exts = ExtFlags {glasgowExtsEF = True,
- ffiEF = True,
- arrowsEF = True,
- withEF = True,
- parrEF = True}
loc = mkSrcLoc (mkFastString file_path) 1 0
\end{code}