diff --git a/ghc/compiler/reader/Lex.lhs b/ghc/compiler/reader/Lex.lhs index c0ce67e2c92e88f0dea0468c7b883772baf864f4..283ce9d7f759ba267e1ab3630d66ee57df03bf82 100644 --- a/ghc/compiler/reader/Lex.lhs +++ b/ghc/compiler/reader/Lex.lhs @@ -210,14 +210,13 @@ data IfaceToken | ITqvarsym (FAST_STRING,FAST_STRING,IfaceFlavour) | ITqconsym (FAST_STRING,FAST_STRING,IfaceFlavour) - | ITidinfo [IfaceToken] -- lazily return the stream of tokens for - -- the info attached to an id. - | ITtysig [IfaceToken] -- lazily return the stream of tokens for + | ITtysig StringBuffer (Maybe StringBuffer) + -- lazily return the stream of tokens for -- the info attached to an id. -- Stuff for reading unfoldings - | ITarity | ITstrict + | ITarity | ITunfold Bool -- True <=> there's an INLINE pragma on this Id - | ITdemand [Demand] | ITbottom + | ITstrict [Demand] | ITbottom | ITlam | ITbiglam | ITcase | ITprim_case | ITlet | ITletrec | ITin | ITof | ITcoerce_in | ITcoerce_out | ITatsign | ITccall (Bool,Bool) -- (is_casm, may_gc) @@ -226,6 +225,7 @@ data IfaceToken | ITinteger Integer | ITdouble Double | ITinteger_lit | ITfloat_lit | ITrational_lit | ITaddr_lit | ITlit_lit | ITstring_lit | ITunknown String -- Used when the lexer can't make sense of it + | ITeof -- end of file token deriving Text -- debugging instance Text CostCentre -- cheat! @@ -239,8 +239,8 @@ instance Text CostCentre -- cheat! %************************************************************************ \begin{code} -lexIface :: StringBuffer -> [IfaceToken] -lexIface buf = +lexIface :: (IfaceToken -> IfM a) -> IfM a +lexIface cont buf = _scc_ "Lexer" -- if bufferExhausted buf then -- [] @@ -248,49 +248,49 @@ lexIface buf = -- _trace ("Lexer: "++[C# (currentChar# buf)]) $ case currentChar# buf of -- whitespace and comments, ignore. - ' '# -> lexIface (stepOn buf) - '\t'# -> lexIface (stepOn buf) - '\n'# -> lexIface (stepOn buf) + ' '# -> lexIface cont (stepOn buf) + '\t'# -> lexIface cont (stepOn buf) + '\n'# -> \line -> lexIface cont (stepOn buf) (line+1) -- Numbers and comments '-'# -> case lookAhead# buf 1# of - '-'# -> lex_comment (stepOnBy# buf 2#) + '-'# -> lex_comment cont (stepOnBy# buf 2#) c -> if isDigit (C# c) - then lex_num (negate) (ord# c -# ord# '0'#) (incLexeme (incLexeme buf)) - else lex_id buf + then lex_num cont (negate) (ord# c -# ord# '0'#) (incLexeme (incLexeme buf)) + else lex_id cont buf -- Leave out nested comments for now; danger of finding { and - juxtaposed by mistake? -- '{' : '-' : cs -> lex_nested_comment 1{-one seen-} cs '('# -> case prefixMatch (stepOn buf) "..)" of - Just buf' -> ITdotdot : lexIface (stepOverLexeme buf') + Just buf' -> cont ITdotdot (stepOverLexeme buf') Nothing -> case lookAhead# buf 1# of - ','# -> lex_tuple Nothing (stepOnBy# buf 2#) - ')'# -> ITconid SLIT("()") : lexIface (stepOnBy# buf 2#) - _ -> IToparen : lexIface (stepOn buf) + ','# -> lex_tuple cont Nothing (stepOnBy# buf 2#) + ')'# -> cont (ITconid SLIT("()")) (stepOnBy# buf 2#) + _ -> cont IToparen (stepOn buf) - '{'# -> ITocurly : lexIface (stepOn buf) - '}'# -> ITccurly : lexIface (stepOn buf) - ')'# -> ITcparen : lexIface (stepOn buf) + '{'# -> cont ITocurly (stepOn buf) + '}'# -> cont ITccurly (stepOn buf) + ')'# -> cont ITcparen (stepOn buf) '['# -> case lookAhead# buf 1# of - ']'# -> ITconid SLIT("[]") : lexIface (stepOnBy# buf 2#) - _ -> ITobrack : lexIface (stepOn buf) - ']'# -> ITcbrack : lexIface (stepOn buf) - ','# -> ITcomma : lexIface (stepOn buf) + ']'# -> cont (ITconid SLIT("[]")) (stepOnBy# buf 2#) + _ -> cont ITobrack (stepOn buf) + ']'# -> cont ITcbrack (stepOn buf) + ','# -> cont ITcomma (stepOn buf) ':'# -> case lookAhead# buf 1# of - ':'# -> ITdcolon : lexIface (stepOnBy# buf 2#) - _ -> lex_id (incLexeme buf) - ';'# -> ITsemi : lexIface (stepOn buf) + ':'# -> cont ITdcolon (stepOnBy# buf 2#) + _ -> lex_id cont (incLexeme buf) + ';'# -> cont ITsemi (stepOn buf) '\"'# -> case untilEndOfString# (stepOn buf) of buf' -> -- the string literal does *not* include the dquotes case lexemeToFastString buf' of - v -> ITstring v : lexIface (stepOn (stepOverLexeme buf')) + v -> cont (ITstring v) (stepOn (stepOverLexeme buf')) '\''# -> -- -- untilEndOfChar# extends the current lexeme until @@ -301,46 +301,46 @@ lexIface buf = -- case untilEndOfChar# (stepOn buf) of buf' -> case reads ('\'':lexemeToString (incLexeme buf')) of - [ (ch, rest)] -> ITchar ch : lexIface (stepOverLexeme (incLexeme buf')) + [ (ch, rest)] -> cont (ITchar ch) (stepOverLexeme (incLexeme buf')) -- ``thingy'' form for casm '`'# -> case lookAhead# buf 1# of - '`'# -> lex_cstring (stepOnBy# buf 2#) -- remove the `` and go. - _ -> lex_id (incLexeme buf) -- add ` to lexeme and assume + '`'# -> lex_cstring cont (stepOnBy# buf 2#) -- remove the `` and go. + _ -> lex_id cont (incLexeme buf) -- add ` to lexeme and assume -- scanning an id of some sort. -- Keywords '_'# -> case lookAhead# buf 1# of 'S'# -> case lookAhead# buf 2# of - '_'# -> ITstrict : - lex_demand (stepOnUntil (not . isSpace) - (stepOnBy# buf 3#)) -- past _S_ + '_'# -> + lex_demand cont (stepOnUntil (not . isSpace) + (stepOnBy# buf 3#)) -- past _S_ 's'# -> case prefixMatch (stepOnBy# buf 2#) "cc_" of - Just buf' -> lex_scc (stepOnUntil (not . isSpace) (stepOverLexeme buf')) - Nothing -> lex_keyword (stepOnBy# buf 1#) -- drop the '_' and assume + Just buf' -> lex_scc cont (stepOnUntil (not . isSpace) (stepOverLexeme buf')) + Nothing -> lex_keyword cont (stepOnBy# buf 1#) -- drop the '_' and assume -- it is a keyword. - _ -> lex_keyword (stepOn buf) + _ -> lex_keyword cont (stepOn buf) '\NUL'# -> if bufferExhausted (stepOn buf) then - [] + cont ITeof buf else - lex_id buf + lex_id cont buf c -> if isDigit (C# c) then - lex_num (id) (ord# c -# ord# '0'#) (incLexeme buf) + lex_num cont (id) (ord# c -# ord# '0'#) (incLexeme buf) else - lex_id buf + lex_id cont buf -- where -lex_comment buf = +lex_comment cont buf = -- _trace ("comment: "++[C# (currentChar# buf)]) $ - case untilChar# buf '\n'# of {buf' -> lexIface (stepOverLexeme buf')} + case untilChar# buf '\n'# of {buf' -> lexIface cont (stepOverLexeme buf')} ------------------ -lex_demand buf = +lex_demand cont buf = -- _trace ("demand: "++[C# (currentChar# buf)]) $ - case read_em [] buf of { (ls,buf') -> ITdemand ls : lexIface (stepOverLexeme buf')} + case read_em [] buf of { (ls,buf') -> cont (ITstrict ls) (stepOverLexeme buf')} where -- code snatched from Demand.lhs read_em acc buf = @@ -363,43 +363,42 @@ lex_demand buf = (stuff, rest) -> read_em (WwUnpack new_or_data wrapper_unpacks stuff : acc) rest ------------------ -lex_scc buf = +lex_scc cont buf = -- _trace ("scc: "++[C# (currentChar# buf)]) $ case currentChar# buf of '"'# -> -- YUCK^2 case prefixMatch (stepOn buf) "NO_CC\"" of - Just buf' -> ITscc noCostCentre : lexIface (stepOverLexeme buf') + Just buf' -> cont (ITscc noCostCentre) (stepOverLexeme buf') Nothing -> case prefixMatch (stepOn buf) "CURRENT_CC\"" of - Just buf' -> ITscc useCurrentCostCentre : lexIface (stepOverLexeme buf') + Just buf' -> cont (ITscc useCurrentCostCentre) (stepOverLexeme buf') Nothing -> case prefixMatch (stepOn buf) "OVERHEAD\"" of - Just buf' -> ITscc overheadCostCentre : lexIface (stepOverLexeme buf') + Just buf' -> cont (ITscc overheadCostCentre) (stepOverLexeme buf') Nothing -> case prefixMatch (stepOn buf) "DONT_CARE\"" of - Just buf' -> ITscc dontCareCostCentre : lexIface (stepOverLexeme buf') + Just buf' -> cont (ITscc dontCareCostCentre) (stepOverLexeme buf') Nothing -> case prefixMatch (stepOn buf) "SUBSUMED\"" of - Just buf' -> ITscc subsumedCosts : lexIface (stepOverLexeme buf') + Just buf' -> cont (ITscc subsumedCosts) (stepOverLexeme buf') Nothing -> case prefixMatch (stepOn buf) "CAFs_in_...\"" of - Just buf' -> ITscc preludeCafsCostCentre : lexIface (stepOverLexeme buf') + Just buf' -> cont (ITscc preludeCafsCostCentre) (stepOverLexeme buf') Nothing -> case prefixMatch (stepOn buf) "CC_CAFs_in_..." of Just buf' -> case untilChar# (stepOverLexeme buf') '\"'# of - buf'' -> ITscc (mkAllCafsCC ({-module-}lexemeToFastString buf'') _NIL_): - lexIface (stepOn (stepOverLexeme buf'')) + buf'' -> cont (ITscc (mkAllCafsCC ({-module-}lexemeToFastString buf'') _NIL_)) (stepOn (stepOverLexeme buf'')) Nothing -> case prefixMatch (stepOn buf) "DICTs_in_...\"" of - Just buf' -> ITscc (preludeDictsCostCentre True) : lexIface (stepOverLexeme buf') + Just buf' -> cont (ITscc (preludeDictsCostCentre True)) (stepOverLexeme buf') Nothing -> case prefixMatch (stepOn buf) "CC_DICTs_in_..." of Just buf' -> case untilChar# (stepOverLexeme buf') '\"'# of - buf'' -> ITscc (mkAllDictsCC (lexemeToFastString buf'') _NIL_ True): - lexIface (stepOn (stepOverLexeme buf'')) + buf'' -> cont (ITscc (mkAllDictsCC (lexemeToFastString buf'') _NIL_ True)) + (stepOn (stepOverLexeme buf'')) Nothing -> let match_user_cc buf = @@ -430,16 +429,17 @@ lex_scc buf = case prefixMatch (stepOn buf) "CAF:" of Just buf' -> case match_user_cc (stepOverLexeme buf') of - (cc, buf'') -> ITscc (cafifyCC cc) : lexIface buf'' + (cc, buf'') -> cont (ITscc (cafifyCC cc)) buf'' Nothing -> case match_user_cc (stepOn buf) of - (cc, buf'') -> ITscc cc : lexIface buf'' - c -> ITunknown [C# c] : lexIface (stepOn buf) + (cc, buf'') -> cont (ITscc cc) buf'' + c -> cont (ITunknown [C# c]) (stepOn buf) ----------- -lex_num :: (Int -> Int) -> Int# -> StringBuffer -> [IfaceToken] -lex_num minus acc# buf = +lex_num :: (IfaceToken -> IfM a) -> + (Int -> Int) -> Int# -> IfM a +lex_num cont minus acc# buf = -- _trace ("lex_num: "++[C# (currentChar# buf)]) $ case scanNumLit (I# acc#) buf of (acc',buf') -> @@ -451,59 +451,60 @@ lex_num minus acc# buf = case expandWhile (isDigit) (incLexeme buf') of buf'' -> -- points to first non digit char case reads (lexemeToString buf'') of - [(v,_)] -> ITdouble v : lexIface (stepOverLexeme buf'') - _ -> ITinteger (fromInt (minus acc')) : lexIface (stepOverLexeme buf') + [(v,_)] -> cont (ITdouble v) (stepOverLexeme buf'') + _ -> cont (ITinteger (fromInt (minus acc'))) (stepOverLexeme buf') -- case reads (lexemeToString buf') of --- [(i,_)] -> ITinteger i : lexIface (stepOverLexeme buf') +-- [(i,_)] -> cont (ITinteger i) (stepOverLexeme buf') ------------ -lex_keyword buf = +lex_keyword cont buf = -- _trace ("lex_keyword: "++[C# (currentChar# buf)]) $ case currentChar# buf of ':'# -> case lookAhead# buf 1# of '_'# -> -- a binding, type (and other id-info) follows, -- to make the parser ever so slightly, we push -- - lex_decl (stepOnBy# buf 2#) - v# -> ITunknown (['_',':',C# v#]) : lexIface (stepOnBy# buf 2#) + lex_decl cont (stepOnBy# buf 2#) + v# -> cont (ITunknown (['_',':',C# v#])) (stepOnBy# buf 2#) _ -> case expandWhile (is_kwd_char) buf of buf' -> let kw = lexemeToFastString buf' in -- _trace ("kw: "++lexemeToString buf') $ case lookupUFM ifaceKeywordsFM kw of - Nothing -> ITunknown (_UNPK_ kw) : -- (minor) sigh - lexIface (stepOverLexeme buf') - Just xx -> xx : lexIface (stepOverLexeme buf') + Nothing -> cont (ITunknown (_UNPK_ kw)) -- (minor) sigh + (stepOverLexeme buf') + Just xx -> cont xx (stepOverLexeme buf') -lex_decl buf = +lex_decl cont buf = case doDiscard False buf of -- spin until ;; is found buf' -> {- _trace (show (lexemeToString buf')) $ -} case currentChar# buf' of '\n'# -> -- newline, no id info. - ITtysig (lexIface (lexemeToBuffer (decLexeme buf'))) : - lexIface (stepOverLexeme buf') + cont (ITtysig (lexemeToBuffer (decLexeme buf')) Nothing) + (stepOverLexeme buf') '\r'# -> -- just to be sure for those Win* boxes.. - ITtysig (lexIface (lexemeToBuffer (decLexeme buf'))) : - lexIface (stepOverLexeme buf') + cont (ITtysig (lexemeToBuffer (decLexeme buf')) Nothing) + (stepOverLexeme buf') '\NUL'# -> - ITtysig (lexIface (lexemeToBuffer (decLexeme buf'))) : - lexIface (stepOverLexeme buf') + cont (ITtysig (lexemeToBuffer (decLexeme buf')) Nothing) + (stepOverLexeme buf') c -> -- run all over the id info case doDiscard False (stepOverLexeme buf') of -- spin until ;; is found (outside a string!) buf'' -> --_trace ((C# c):show (lexemeToString (decLexeme buf'))) $ --_trace (show (lexemeToString (decLexeme buf''))) $ - ITtysig (lexIface (lexemeToBuffer (decLexeme buf'))): - let ls = lexIface (stepOverLexeme buf'') in - if opt_IgnoreIfacePragmas then - ls - else - let is = lexIface (lexemeToBuffer (decLexeme buf'')) in + let idinfo = + if opt_IgnoreIfacePragmas then + Nothing + else + Just (lexemeToBuffer (decLexeme buf'')) --_trace (show is) $ - ITidinfo is : ls + in + cont (ITtysig (lexemeToBuffer (decLexeme buf')) idinfo) + (stepOverLexeme buf'') -- ToDo: hammer! is_kwd_char c@(C# c#) = @@ -518,22 +519,22 @@ is_kwd_char c@(C# c#) = ----------- -lex_cstring buf = +lex_cstring cont buf = -- _trace ("lex_cstring: "++[C# (currentChar# buf)]) $ case expandUntilMatch buf "\'\'" of - buf' -> ITstring (lexemeToFastString (setCurrentPos# buf' (negateInt# 2#))) : - lexIface (stepOverLexeme buf') + buf' -> cont (ITstring (lexemeToFastString (setCurrentPos# buf' (negateInt# 2#)))) + (stepOverLexeme buf') ----------- -lex_tuple module_dot buf = +lex_tuple cont module_dot buf = -- _trace ("lex_tuple: "++[C# (currentChar# buf)]) $ go 2 buf where go n buf = case currentChar# buf of ','# -> go (n+1) (stepOn buf) - ')'# -> end_lex_id module_dot (ITconid (mkTupNameStr n)) (stepOn buf) - _ -> ITunknown ("tuple " ++ show n) : lexIface buf + ')'# -> end_lex_id cont module_dot (ITconid (mkTupNameStr n)) (stepOn buf) + _ -> cont (ITunknown ("tuple " ++ show n)) buf -- Similarly ' itself is ok inside an identifier, but not at the start @@ -631,56 +632,56 @@ lex_id cs = -} -lex_id buf = +lex_id cont buf = -- _trace ("lex_id: "++[C# (currentChar# buf)]) $ case expandWhile (is_mod_char) buf of buf' -> case currentChar# buf' of '.'# -> munch buf' HiFile '!'# -> munch buf' HiBootFile - _ -> lex_id2 Nothing buf' + _ -> lex_id2 cont Nothing buf' where munch buf' hif = if not (emptyLexeme buf') then -- _trace ("lex_id: "++(C# (currentChar# (stepOverLexeme buf'))):show (lexemeToFastString buf')) $ case lexemeToFastString buf' of - l@(FastString u# l# ba#) -> lex_id2 (Just (FastString u# l# ba#, hif)) + l@(FastString u# l# ba#) -> lex_id2 cont (Just (FastString u# l# ba#, hif)) (stepOn (stepOverLexeme buf')) else - lex_id2 Nothing buf' + lex_id2 cont Nothing buf' -- Dealt with the Module.part -lex_id2 module_dot buf = +lex_id2 cont module_dot buf = -- _trace ("lex_id2: "++[C# (currentChar# buf)]) $ case currentChar# buf of '['# -> case lookAhead# buf 1# of - ']'# -> end_lex_id module_dot (ITconid SLIT("[]")) (stepOnBy# buf 2#) - _ -> lex_id3 module_dot buf + ']'# -> end_lex_id cont module_dot (ITconid SLIT("[]")) (stepOnBy# buf 2#) + _ -> lex_id3 cont module_dot buf '('# -> case lookAhead# buf 1# of - ')'# -> end_lex_id module_dot (ITconid SLIT("()")) (stepOnBy# buf 2#) - ','# -> lex_tuple module_dot (stepOnBy# buf 2#) - _ -> lex_id3 module_dot buf - ':'# -> lex_id3 module_dot (incLexeme buf) - _ -> lex_id3 module_dot buf + ')'# -> end_lex_id cont module_dot (ITconid SLIT("()")) (stepOnBy# buf 2#) + ','# -> lex_tuple cont module_dot (stepOnBy# buf 2#) + _ -> lex_id3 cont module_dot buf + ':'# -> lex_id3 cont module_dot (incLexeme buf) + _ -> lex_id3 cont module_dot buf -- Dealt with [], (), : special cases -lex_id3 module_dot buf = +lex_id3 cont module_dot buf = -- _trace ("lex_id3: "++[C# (currentChar# buf)]) $ case expandWhile (is_id_char) buf of buf' -> case module_dot of Just _ -> - end_lex_id module_dot (mk_var_token lexeme) (stepOverLexeme buf') + end_lex_id cont module_dot (mk_var_token lexeme) (stepOverLexeme buf') Nothing -> case _scc_ "Lex.haskellKeyword" lookupUFM haskellKeywordsFM lexeme of - Just kwd_token -> kwd_token : lexIface new_buf - Nothing -> mk_var_token lexeme : lexIface new_buf + Just kwd_token -> cont kwd_token new_buf + Nothing -> cont (mk_var_token lexeme) new_buf where lexeme = lexemeToFastString buf' new_buf = stepOverLexeme buf' @@ -694,7 +695,6 @@ lex_id2 module_dot [] (':' : cs) = lex_id3 module_dot [':'] cs lex_id2 module_dot xs cs = lex_id3 module_dot xs cs -} - -- Dealt with [], (), : special cases {- @@ -734,15 +734,15 @@ mk_var_token pk_str = n = _PK_ xs -} -end_lex_id Nothing token buf = token : lexIface buf -end_lex_id (Just (m,hif)) token buf = +end_lex_id cont Nothing token buf = cont token buf +end_lex_id cont (Just (m,hif)) token buf = case token of - ITconid n -> ITqconid (m,n,hif) : lexIface buf - ITvarid n -> ITqvarid (m,n,hif) : lexIface buf - ITconsym n -> ITqconsym (m,n,hif) : lexIface buf - ITvarsym n -> ITqvarsym (m,n,hif) : lexIface buf - ITbang -> ITqvarsym (m,SLIT("!"),hif) : lexIface buf - _ -> ITunknown (show token) : lexIface buf + ITconid n -> cont (ITqconid (m,n,hif)) buf + ITvarid n -> cont (ITqvarid (m,n,hif)) buf + ITconsym n -> cont (ITqconsym (m,n,hif)) buf + ITvarsym n -> cont (ITqvarsym (m,n,hif)) buf + ITbang -> cont (ITqvarsym (m,SLIT("!"),hif)) buf + _ -> cont (ITunknown (show token)) buf ------------ ifaceKeywordsFM :: UniqFM IfaceToken @@ -862,21 +862,22 @@ end{code} %************************************************************************ \begin{code} -type IfM a = MaybeErr a Error +type IfM a = StringBuffer -> Int -> MaybeErr a Error returnIf :: a -> IfM a -thenIf :: IfM a -> (a -> IfM b) -> IfM b -happyError :: Int -> [IfaceToken] -> IfM a +returnIf a s l = Succeeded a -returnIf a = Succeeded a - -thenIf (Succeeded a) k = k a -thenIf (Failed err) _ = Failed err +thenIf :: IfM a -> (a -> IfM b) -> IfM b +m `thenIf` k = \s l -> + case m s l of + Succeeded a -> k a s l + Failed err -> Failed err -happyError ln toks = Failed (ifaceParseErr ln toks) +happyError :: IfM a +happyError s l = Failed (ifaceParseErr l ([]::[IfaceToken]){-Todo-}) ----------------------------------------------------------------- -ifaceParseErr ln toks sty - = hsep [ptext SLIT("Interface-file parse error: line"), int ln, ptext SLIT("toks="), text (show (take 10 toks))] +ifaceParseErr l toks sty + = hsep [ptext SLIT("Interface-file parse error: line"), int l, ptext SLIT("toks="), text (show (take 10 toks))] \end{code} diff --git a/ghc/compiler/rename/ParseIface.y b/ghc/compiler/rename/ParseIface.y index 7bfff2a461a782f6cd91ee8e84d984fc86b86647..813a0f94a3906da60b6aff119cab3652b36a01f5 100644 --- a/ghc/compiler/rename/ParseIface.y +++ b/ghc/compiler/rename/ParseIface.y @@ -28,16 +28,12 @@ import ParseType ( parseType ) import ParseUnfolding ( parseUnfolding ) import Maybes ------------------------------------------------------------------ - -parseIface ls = parseIToks (lexIface ls) - ------------------------------------------------------------------ } -%name parseIToks +%name parseIface %tokentype { IfaceToken } %monad { IfM }{ thenIf }{ returnIf } +%lexer { lexIface } { ITeof } %token INTERFACE { ITinterface } @@ -85,12 +81,10 @@ parseIface ls = parseIToks (lexIface ls) QVARSYM { ITqvarsym $$ } QCONSYM { ITqconsym $$ } - IDINFO_PART { ITidinfo $$ } - TYPE_PART { ITtysig $$ } + TYPE_PART { ITtysig _ _ } ARITY_PART { ITarity } - STRICT_PART { ITstrict } + STRICT_PART { ITstrict $$ } UNFOLD_PART { ITunfold $$ } - DEMAND { ITdemand $$ } BOTTOM { ITbottom } LAM { ITlam } BIGLAM { ITbiglam } @@ -238,16 +232,18 @@ topdecl : TYPE tc_name tv_bndrs EQUAL type SEMI { TyD (TyData NewType $2 $3 $4 $5 $6 noDataPragmas mkIfaceSrcLoc) } | CLASS decl_context tc_name tv_bndr csigs SEMI { ClD (ClassDecl $2 $3 $4 $5 EmptyMonoBinds noClassPragmas mkIfaceSrcLoc) } - | var_name TYPE_PART id_info + | var_name TYPE_PART { - let - (Succeeded tp) = parseType $2 - in - SigD (IfaceSig $1 tp $3 mkIfaceSrcLoc) } - -id_info :: { [HsIdInfo RdrName] } -id_info : { [] } - | IDINFO_PART { let { (Succeeded id_info) = parseUnfolding $1 } in id_info} + case $2 of + ITtysig sig idinfo_part -> + let info = + case idinfo_part of + Nothing -> [] + Just s -> + let { (Succeeded id_info) = parseUnfolding s } in id_info + (Succeeded tp) = parseType sig + in + SigD (IfaceSig $1 tp info mkIfaceSrcLoc) } decl_context :: { RdrNameContext } decl_context : { [] } @@ -410,7 +406,7 @@ tc_name : tc_occ { Unqual $1 } tv_name :: { RdrName } tv_name : VARID { Unqual (TvOcc $1) } - | VARSYM { Unqual (TvOcc $1) {- Allow $t2 as a tyvar -} } + | VARSYM { Unqual (TvOcc $1) {- Allow t2 as a tyvar -} } tv_names :: { [RdrName] } : { [] } diff --git a/ghc/compiler/rename/ParseType.y b/ghc/compiler/rename/ParseType.y index 9c8392e029df49251a7e337652ab03ae7249f02b..1039a42effe69616b0cf9a916c48439faa33e96c 100644 --- a/ghc/compiler/rename/ParseType.y +++ b/ghc/compiler/rename/ParseType.y @@ -31,11 +31,11 @@ import Maybes ( MaybeErr(..) ) ------------------------------------------------------------------ -parseType :: [IfaceToken] -> MaybeErr RdrNameHsType (PprStyle -> Doc) +parseType :: StringBuffer -> MaybeErr RdrNameHsType (PprStyle -> Doc) parseType ls = let res = - case parseT ls of + case parseT ls 1 of v@(Succeeded _) -> v Failed err -> panic (show (err PprDebug)) in @@ -45,7 +45,8 @@ parseType ls = %name parseT %tokentype { IfaceToken } -%monad { IfM }{ thenIf }{ returnIf } +%monad { IfM }{ thenIf }{ returnIf } +%lexer { lexIface } { ITeof } %token FORALL { ITforall } @@ -128,7 +129,7 @@ akind :: { Kind } tv_name :: { RdrName } tv_name : VARID { Unqual (TvOcc $1) } - | VARSYM { Unqual (TvOcc $1) {- Allow $t2 as a tyvar -} } + | VARSYM { Unqual (TvOcc $1) {- Allow t2 as a tyvar -} } tv_names :: { [RdrName] } : { [] } diff --git a/ghc/compiler/rename/ParseUnfolding.y b/ghc/compiler/rename/ParseUnfolding.y index be2d3d14d3431b1b82ceba49e14d46b7207bdc4f..a2351a4505718856d06bf48984b2135e7f9051cf 100644 --- a/ghc/compiler/rename/ParseUnfolding.y +++ b/ghc/compiler/rename/ParseUnfolding.y @@ -35,7 +35,7 @@ import Maybes ( MaybeErr(..) ) parseUnfolding ls = let res = - case parseUnfold ls of + case parseUnfold ls 1 of -- Todo: correct line number v@(Succeeded _) -> v -- ill-formed unfolding, crash and burn. Failed err -> panic (show (err PprDebug)) @@ -45,7 +45,8 @@ parseUnfolding ls = %name parseUnfold %tokentype { IfaceToken } -%monad { IfM }{ thenIf }{ returnIf } +%monad { IfM }{ thenIf }{ returnIf } +%lexer { lexIface } { ITeof } %token PRAGMAS_PART { ITpragmas } @@ -83,9 +84,8 @@ parseUnfolding ls = QCONSYM { ITqconsym $$ } ARITY_PART { ITarity } - STRICT_PART { ITstrict } + DEMAND { ITstrict $$ } UNFOLD_PART { ITunfold $$ } - DEMAND { ITdemand $$ } BOTTOM { ITbottom } LAM { ITlam } BIGLAM { ITbiglam } @@ -122,7 +122,7 @@ id_info : { [] } id_info_item :: { HsIdInfo RdrName } id_info_item : ARITY_PART arity_info { HsArity $2 } - | STRICT_PART strict_info { HsStrictness $2 } + | strict_info { HsStrictness $1 } | BOTTOM { HsStrictness HsBottom } | UNFOLD_PART core_expr { HsUnfold $1 $2 } @@ -339,7 +339,7 @@ akind :: { Kind } tv_name :: { RdrName } tv_name : VARID { Unqual (TvOcc $1) } - | VARSYM { Unqual (TvOcc $1) {- Allow $t2 as a tyvar -} } + | VARSYM { Unqual (TvOcc $1) {- Allow t2 as a tyvar -} } tv_names :: { [RdrName] } : { [] } diff --git a/ghc/compiler/rename/RnIfaces.lhs b/ghc/compiler/rename/RnIfaces.lhs index d31a9ff25a931bde823b3cd53fd026b397a1c07d..ed0014f95bde79cd7ab5983990a705d689d01e18 100644 --- a/ghc/compiler/rename/RnIfaces.lhs +++ b/ghc/compiler/rename/RnIfaces.lhs @@ -961,7 +961,7 @@ readIface file_path --traceRn (hcat[ptext SLIT("Opening...."), text file_path]) `thenRn_` case read_result of Right contents -> - case parseIface contents of + case parseIface contents 1 of Failed err -> --traceRn (ptext SLIT("parse err")) `thenRn_` failWithRn Nothing err diff --git a/ghc/compiler/utils/StringBuffer.lhs b/ghc/compiler/utils/StringBuffer.lhs index 0175a2bfffbe619ba0a937e0fccbd131b7e7c86f..12c719057970f6e7f390649b8a7173020c16b5dd 100644 --- a/ghc/compiler/utils/StringBuffer.lhs +++ b/ghc/compiler/utils/StringBuffer.lhs @@ -92,7 +92,11 @@ data StringBuffer \end{code} \begin{code} +instance Text StringBuffer where + showsPrec _ s = showString "" +\end{code} +\begin{code} hGetStringBuffer :: FilePath -> IO StringBuffer hGetStringBuffer fname = -- trace ("Renamer: opening " ++ fname) $