diff options
Diffstat (limited to 'ghc/compiler/reader/ReadPrefix.lhs')
-rw-r--r-- | ghc/compiler/reader/ReadPrefix.lhs | 1670 |
1 files changed, 803 insertions, 867 deletions
diff --git a/ghc/compiler/reader/ReadPrefix.lhs b/ghc/compiler/reader/ReadPrefix.lhs index 5458884e66..6043f72c10 100644 --- a/ghc/compiler/reader/ReadPrefix.lhs +++ b/ghc/compiler/reader/ReadPrefix.lhs @@ -1,56 +1,37 @@ % -% (c) The GRASP/AQUA Project, Glasgow University, 1992-1995 +% (c) The AQUA Project, Glasgow University, 1994-1996 % -\section[ReadPrefix]{Read prefix-form input} - -This module contains a function, @rdModule@, which reads a Haskell -module in `prefix form' emitted by the Lex/Yacc parser. - -The prefix form string is converted into an algebraic data type -defined in @PrefixSyn@. - -Identifier names are converted into the @ProtoName@ data type. - -@sf@ is used consistently to mean ``source file'' (name). +\section{Read parse tree built by Yacc parser} \begin{code} --- HBC does not have stack stubbing; you get a space leak w/ --- default defns from HsVersions.h. - --- GHC may be overly slow to compile w/ the defaults... - -#define BIND {--} -#define _TO_ `thenLft` ( \ {--} -#define BEND ) -#define RETN returnLft -#define RETN_TYPE LiftM - #include "HsVersions.h" -\end{code} -\begin{code} module ReadPrefix ( rdModule, - rdList, rdId, rdIdString, rdString, rdConDecl, rdMonoType - ) where + -- used over in ReadPragmas... + wlkList, wlkMaybe, rdConDecl, wlkMonoType, rdMonoType + ) where -IMPORT_Trace -- ToDo: rm (debugging) -import Pretty +import Ubiq{-uitous-} +import RdrLoop -- for paranoia checking + +import UgenAll -- all Yacc parser gumpff... +import PrefixSyn -- and various syntaxen. +import HsSyn +import RdrHsSyn -import AbsSyn -import HsCore -- ****** NEED TO SEE CONSTRUCTORS ****** -import HsPragmas -- ****** NEED TO SEE CONSTRUCTORS ****** -import IdInfo ( UnfoldingGuidance(..) ) -import LiftMonad -import Maybes ( Maybe(..) ) -import PrefixToHs -import PrefixSyn -import ProtoName -import Outputable +-- friends: import ReadPragmas -import SrcLoc ( mkSrcLoc ) -import Util +import PrefixToHs -- reader utilities + +-- others: +import FiniteMap ( elemFM, FiniteMap ) +import MainMonad ( thenMn, MainIO(..) ) +import PprStyle ( PprStyle(..) ) +import Pretty +import ProtoName ( isConopPN, ProtoName(..) ) +import Util ( nOfThem, panic ) \end{code} %************************************************************************ @@ -60,52 +41,36 @@ import Util %************************************************************************ \begin{code} -rdList :: (String -> RETN_TYPE (a, String)) -> String -> RETN_TYPE ([a], String) - -rdList rd_it ('N':xs) = RETN ([], xs) -rdList rd_it ('L':xs) - = BIND (rd_it xs) _TO_ (hd_it, xs1) -> - BIND (rdList rd_it xs1) _TO_ (tl_it, xs2) -> - RETN (hd_it : tl_it, xs2) - BEND BEND -rdList rd_it junk = panic ("ReadPrefix.rdList:"++junk) - -rdString, rdIdString :: String -> RETN_TYPE (FAST_STRING, String) -rdId :: String -> RETN_TYPE (ProtoName, String) - -rdString ('#':xs) = BIND (split_at_tab xs) _TO_ (str, rest) -> - RETN (_PK_ (de_escape str), rest) - BEND - where - -- partain: tabs and backslashes are escaped - de_escape [] = [] - de_escape ('\\':'\\':xs) = '\\' : (de_escape xs) - de_escape ('\\':'t':xs) = '\t' : (de_escape xs) - de_escape (x:xs) = x : (de_escape xs) - -rdString xs = panic ("ReadPrefix.rdString:"++xs) - -rdIdString ('#':xs) = BIND (split_at_tab xs) _TO_ (stuff,rest) -> -- no de-escaping... - RETN (_PK_ stuff, rest) - BEND -rdIdString other = panic ("rdIdString:"++other) - - -- no need to de-escape it... -rdId ('#':xs) = BIND (split_at_tab xs) _TO_ (str, rest) -> - RETN (Unk (_PK_ str), rest) - BEND - -split_at_tab :: String -> RETN_TYPE (String, String) -- a la Lennart -split_at_tab xs - = split_me [] xs - where - split_me acc ('\t' : ys) = BIND (my_rev acc []) _TO_ reversed -> - RETN (reversed, ys) - BEND - split_me acc (y : ys) = split_me (y:acc) ys +wlkList :: (U_VOID_STAR -> UgnM a) -> U_list -> UgnM [a] - my_rev "" acc = RETN acc -- instead of reverse, so can see on heap-profiles - my_rev (x:xs) acc = my_rev xs (x:acc) +wlkList wlk_it U_lnil = returnUgn [] + +wlkList wlk_it (U_lcons hd tl) + = wlk_it hd `thenUgn` \ hd_it -> + wlkList wlk_it tl `thenUgn` \ tl_it -> + returnUgn (hd_it : tl_it) +\end{code} + +\begin{code} +wlkMaybe :: (U_VOID_STAR -> UgnM a) -> U_maybe -> UgnM (Maybe a) + +wlkMaybe wlk_it U_nothing = returnUgn Nothing +wlkMaybe wlk_it (U_just x) + = wlk_it x `thenUgn` \ it -> + returnUgn (Just it) +\end{code} + +\begin{code} +rdQid :: ParseTree -> UgnM ProtoName +rdQid pt = rdU_qid pt `thenUgn` \ qid -> wlkQid qid + +wlkQid :: U_qid -> UgnM ProtoName +wlkQid (U_noqual name) + = returnUgn (Unk name) +wlkQid (U_aqual mod name) + = returnUgn (Qunk mod name) +wlkQid (U_gid n name) + = returnUgn (Unk name) \end{code} %************************************************************************ @@ -115,735 +80,673 @@ split_at_tab xs %************************************************************************ \begin{code} -rdModule :: String - -> (FAST_STRING, -- this module's name - (FAST_STRING -> Bool, -- a function to chk if <x> is in the export list - FAST_STRING -> Bool), -- a function to chk if <M> is among the M.. - -- ("dotdot") modules in the export list. - ProtoNameModule) -- the main goods - -rdModule (next_char:xs) - = case next_char of { 'M' -> - - BIND (rdString xs) _TO_ (srcline, xs1) -> - BIND (rdIdString xs1) _TO_ (name, xs2) -> - BIND (rdString xs2) _TO_ (srcfile, xs3) -> - BIND (rdBinding srcfile xs3) _TO_ (binding, xs4) -> - BIND (rdList rdFixity xs4) _TO_ (fixities, xs5) -> - BIND (rdList (rdImportedInterface srcfile) xs5) _TO_ (imports, xs6) -> - BIND (rdList rdEntity xs6) _TO_ (export_list, _) -> +rdModule :: MainIO + (FAST_STRING, -- this module's name + (FAST_STRING -> Bool, -- a function to chk if <x> is in the export list + FAST_STRING -> Bool), -- a function to chk if <M> is among the M.. + -- ("dotdot") modules in the export list. + ProtoNameHsModule) -- the main goods + +rdModule + = _ccall_ hspmain `thenPrimIO` \ pt -> -- call the Yacc parser! + let + srcfile = _packCString ``input_filename'' -- What A Great Hack! (TM) + in + initUgn srcfile ( + + rdU_tree pt `thenUgn` \ (U_hmodule name himplist hexplist hfixlist hmodlist srcline) -> + wlkList rdFixOp hfixlist `thenUgn` \ fixities -> + wlkBinding hmodlist `thenUgn` \ binding -> + wlkList rdImportedInterface himplist `thenUgn` \ imports -> + wlkMaybe rdEntities hexplist `thenUgn` \ exp_list -> + mkSrcLocUgn srcline `thenUgn` \ src_loc -> case sepDeclsForTopBinds binding of { (tydecls, tysigs, classdecls, instdecls, instsigs, defaultdecls, binds) -> - (name, - mk_export_list_chker export_list, - Module name - export_list - imports - fixities - tydecls - tysigs - classdecls - (cvInstDecls True name name instdecls) -- True indicates not imported - instsigs - defaultdecls - (cvSepdBinds srcfile cvValSig binds) - [{-no sigs-}] - (mkSrcLoc srcfile srcline) - ) - } BEND BEND BEND BEND BEND BEND BEND - } + returnUgn ( + name, + mk_export_list_chker exp_list, + HsModule name + exp_list + imports + fixities + tydecls + tysigs + classdecls + instdecls + instsigs + defaultdecls + (cvSepdBinds srcfile cvValSig binds) + [{-no sigs-}] + src_loc + ) } ) where + mk_export_list_chker = panic "ReadPrefix:mk_export_list_chker" +{- LATER: mk_export_list_chker exp_list - = case (getIEStrings exp_list) of { (entity_info, dotdot_modules) -> - ( \ n -> n `elemFM` just_the_strings, - \ n -> n `elemFM` dotdot_modules ) - } + = case (getExportees exp_list) of + Nothing -> ( \ n -> False, \ n -> False ) -- all suspicious + Just (entity_info, dotdot_modules) -> + ( \ n -> n `elemFM` entity_info, + \ n -> n `elemFM` dotdot_modules ) +-} \end{code} %************************************************************************ %* * -\subsection[rdExprOrPat]{@rdExpr@ and @rdPat@} +\subsection[wlkExprOrPat]{@wlkExpr@ and @wlkPat@} %* * %************************************************************************ \begin{code} -rdExpr :: SrcFile -> String -> RETN_TYPE (ProtoNameExpr, String) -rdPat :: SrcFile -> String -> RETN_TYPE (ProtoNamePat, String) - -rdExpr sf (next_char:xs) - = case next_char of - '(' -> -- left section - BIND (rdExpr sf xs) _TO_ (expr,xs1) -> - BIND (rdId xs1) _TO_ (id, xs2) -> - RETN (SectionL expr (Var id), xs2) - BEND BEND - - ')' -> -- right section - BIND (rdId xs) _TO_ (id, xs1) -> - BIND (rdExpr sf xs1) _TO_ (expr,xs2) -> - RETN (SectionR (Var id) expr, xs2) - BEND BEND - - 'j' -> -- ccall/casm - BIND (rdString xs) _TO_ (fun, xs1) -> - BIND (rdString xs1) _TO_ (flavor, xs2) -> - BIND (rdList (rdExpr sf) xs2) _TO_ (args, xs3) -> - RETN (CCall fun args - (flavor == SLIT("p") || flavor == SLIT("P")) -- may invoke GC - (flavor == SLIT("N") || flavor == SLIT("P")) -- really a "casm" - (panic "CCall:result_ty"), - xs3) - BEND BEND BEND - - 'k' -> -- scc (set-cost-centre) expression - BIND (rdString xs) _TO_ (label, xs1) -> - BIND (rdExpr sf xs1) _TO_ (expr, xs2) -> - RETN (SCC label expr, xs2) - BEND BEND - - 'l' -> -- lambda expression - BIND (rdString xs) _TO_ (srcline, xs1) -> - BIND (rdList (rdPat sf) xs1) _TO_ (pats, xs2) -> - BIND (rdExpr sf xs2) _TO_ (body, xs3) -> - let - src_loc = mkSrcLoc sf srcline - in - RETN (Lam (foldr PatMatch - (GRHSMatch (GRHSsAndBindsIn - [OtherwiseGRHS body src_loc] - EmptyBinds)) - pats - ), - xs3) - BEND BEND BEND - - 'c' -> -- case expression - BIND (rdExpr sf xs) _TO_ (expr, xs1) -> - BIND (rdList (rdMatch sf) xs1) _TO_ (mats, xs2) -> - let - matches = cvMatches sf True mats - in - RETN (Case expr matches, xs2) - BEND BEND - - 'b' -> -- if expression - BIND (rdExpr sf xs) _TO_ (e1, xs1) -> - BIND (rdExpr sf xs1) _TO_ (e2, xs2) -> - BIND (rdExpr sf xs2) _TO_ (e3, xs3) -> - RETN (If e1 e2 e3, xs3) - BEND BEND BEND - - 'E' -> -- let expression - BIND (rdBinding sf xs) _TO_ (binding,xs1) -> - BIND (rdExpr sf xs1) _TO_ (expr, xs2) -> - let - binds = cvBinds sf cvValSig binding - in - RETN (Let binds expr, xs2) - BEND BEND - - 'Z' -> -- list comprehension - BIND (rdExpr sf xs) _TO_ (expr, xs1) -> - BIND (rdList rd_qual xs1) _TO_ (quals, xs2) -> - RETN (ListComp expr quals, xs2) - BEND BEND - where - rd_qual ('G':xs) - = BIND (rdPat sf xs) _TO_ (pat, xs1) -> - BIND (rdExpr sf xs1) _TO_ (expr,xs2) -> - RETN (GeneratorQual pat expr, xs2) - BEND BEND - - rd_qual ('g':xs) - = BIND (rdExpr sf xs) _TO_ (expr,xs1) -> - RETN (FilterQual expr, xs1) - BEND - - '.' -> -- arithmetic sequence - BIND (rdExpr sf xs) _TO_ (e1, xs1) -> - BIND (rdList (rdExpr sf) xs1) _TO_ (es2, xs2) -> - BIND (rdList (rdExpr sf) xs2) _TO_ (es3, xs3) -> - RETN (cv_arith_seq e1 es2 es3, xs3) - BEND BEND BEND - where - cv_arith_seq e1 [] [] = ArithSeqIn (From e1) - cv_arith_seq e1 [] [e3] = ArithSeqIn (FromTo e1 e3) - cv_arith_seq e1 [e2] [] = ArithSeqIn (FromThen e1 e2) - cv_arith_seq e1 [e2] [e3] = ArithSeqIn (FromThenTo e1 e2 e3) - - 'R' -> -- expression with type signature - BIND (rdExpr sf xs) _TO_ (expr,xs1) -> - BIND (rdPolyType xs1) _TO_ (ty, xs2) -> - RETN (ExprWithTySig expr ty, xs2) - BEND BEND - - '-' -> -- negated expression - BIND (rdExpr sf xs) _TO_ (expr,xs1) -> - RETN (App (Var (Unk SLIT("negate"))) expr, xs1) - BEND -#ifdef DPH - '5' -> -- parallel ZF expression - BIND (rdExpr sf xs) _TO_ (expr, xs1) -> - BIND (rdList (rd_par_qual sf) xs1) _TO_ (qual_list, xs2) -> - let - quals = foldr1 AndParQuals qual_list - in - RETN (RdrParallelZF expr quals, xs2) - BEND BEND - where - rdParQual sf inp - = case inp of - -- ToDo:DPH: I have kawunkled your RdrExplicitProcessor hack - '0':xs -> BIND (rdExPat sf xs) _TO_ (RdrExplicitProcessor pats pat, xs1) -> - BIND (rdExpr sf xs1) _TO_ (expr, xs2) -> - RETN (DrawnGenIn pats pat expr, xs2) - BEND BEND - - 'w':xs -> BIND (rdExPat sf xs) _TO_ (RdrExplicitProcessor exprs pat, xs1) -> - BIND (rdExpr sf xs1) _TO_ (expr, xs2) -> - RETN (IndexGen exprs pat expr, xs2) - BEND BEND - - 'I':xs -> BIND (rdExpr sf xs) _TO_ (expr,xs1) -> - RETN (ParFilter expr, xs1) - BEND - - '6' -> -- explicitPod expression - BIND (rdList (rdExpr sf) xs) _TO_ (exprs,xs1) -> - RETN (RdrExplicitPod exprs,xs1) - BEND -#endif {- Data Parallel Haskell -} - - -------------------------------------------------------------- - -- now the prefix items that can either be an expression or - -- pattern, except we know they are *expressions* here - -- (this code could be commoned up with the pattern version; - -- but it probably isn't worth it) - -------------------------------------------------------------- - 'C' -> BIND (rdLiteral xs) _TO_ (lit, xs1) -> - RETN (Lit lit, xs1) - BEND - - 'i' -> -- simple identifier - BIND (rdId xs) _TO_ (str,xs1) -> - RETN (Var str, xs1) - BEND - - 'a' -> -- application - BIND (rdExpr sf xs) _TO_ (expr1, xs1) -> - BIND (rdExpr sf xs1) _TO_ (expr2, xs2) -> - RETN (App expr1 expr2, xs2) - BEND BEND - - '@' -> -- operator application - BIND (rdExpr sf xs) _TO_ (expr1, xs1) -> - BIND (rdId xs1) _TO_ (op, xs2) -> - BIND (rdExpr sf xs2) _TO_ (expr2, xs3) -> - RETN (OpApp expr1 (Var op) expr2, xs3) - BEND BEND BEND - - ':' -> -- explicit list - BIND (rdList (rdExpr sf) xs) _TO_ (exprs, xs1) -> - RETN (ExplicitList exprs, xs1) - BEND - - ',' -> -- explicit tuple - BIND (rdList (rdExpr sf) xs) _TO_ (exprs, xs1) -> - RETN (ExplicitTuple exprs, xs1) - BEND - -#ifdef DPH - 'O' -> -- explicitProcessor expression - BIND (rdList (rdExpr sf) xs) _TO_ (exprs,xs1) -> - BIND (rdExpr sf xs1) _TO_ (expr, xs2) -> - RETN (ExplicitProcessor exprs expr, xs2) - BEND BEND -#endif {- Data Parallel Haskell -} - - huh -> panic ("ReadPrefix.rdExpr:"++(next_char:xs)) +rdExpr :: ParseTree -> UgnM ProtoNameHsExpr +rdPat :: ParseTree -> UgnM ProtoNamePat + +rdExpr pt = rdU_tree pt `thenUgn` \ tree -> wlkExpr tree +rdPat pt = rdU_tree pt `thenUgn` \ tree -> wlkPat tree + +wlkExpr :: U_tree -> UgnM ProtoNameHsExpr +wlkPat :: U_tree -> UgnM ProtoNamePat + +wlkExpr expr + = case expr of + U_par expr -> -- parenthesised expr + wlkExpr expr + + U_lsection lsexp lop -> -- left section + wlkExpr lsexp `thenUgn` \ expr -> + wlkQid lop `thenUgn` \ op -> + returnUgn (SectionL expr (HsVar op)) + + U_rsection rop rsexp -> -- right section + wlkQid rop `thenUgn` \ op -> + wlkExpr rsexp `thenUgn` \ expr -> + returnUgn (SectionR (HsVar op) expr) + + U_ccall fun flavor ccargs -> -- ccall/casm + wlkList rdExpr ccargs `thenUgn` \ args -> + let + tag = _HEAD_ flavor + in + returnUgn (CCall fun args + (tag == 'p' || tag == 'P') -- may invoke GC + (tag == 'N' || tag == 'P') -- really a "casm" + (panic "CCall:result_ty")) + + U_scc label sccexp -> -- scc (set-cost-centre) expression + wlkExpr sccexp `thenUgn` \ expr -> + returnUgn (HsSCC label expr) + + U_lambda lampats lamexpr srcline -> -- lambda expression + wlkList rdPat lampats `thenUgn` \ pats -> + wlkExpr lamexpr `thenUgn` \ body -> + mkSrcLocUgn srcline `thenUgn` \ src_loc -> + returnUgn ( + HsLam (foldr PatMatch + (GRHSMatch (GRHSsAndBindsIn + [OtherwiseGRHS body src_loc] + EmptyBinds)) + pats) + ) + + U_casee caseexpr casebody srcline -> -- case expression + wlkExpr caseexpr `thenUgn` \ expr -> + wlkList rdMatch casebody `thenUgn` \ mats -> + mkSrcLocUgn srcline `thenUgn` \ src_loc -> + getSrcFileUgn `thenUgn` \ sf -> + let + matches = cvMatches sf True mats + in + returnUgn (HsCase expr matches src_loc) + + U_ife ifpred ifthen ifelse srcline -> -- if expression + wlkExpr ifpred `thenUgn` \ e1 -> + wlkExpr ifthen `thenUgn` \ e2 -> + wlkExpr ifelse `thenUgn` \ e3 -> + mkSrcLocUgn srcline `thenUgn` \ src_loc -> + returnUgn (HsIf e1 e2 e3 src_loc) + + U_let letvdefs letvexpr -> -- let expression + wlkBinding letvdefs `thenUgn` \ binding -> + wlkExpr letvexpr `thenUgn` \ expr -> + getSrcFileUgn `thenUgn` \ sf -> + let + binds = cvBinds sf cvValSig binding + in + returnUgn (HsLet binds expr) + + U_doe gdo srcline -> -- do expression + wlkList rd_stmt gdo `thenUgn` \ stmts -> + mkSrcLocUgn srcline `thenUgn` \ src_loc -> + returnUgn (HsDo stmts src_loc) + where + rd_stmt pt + = rdU_tree pt `thenUgn` \ bind -> + case bind of + U_doexp exp srcline -> + wlkExpr exp `thenUgn` \ expr -> + mkSrcLocUgn srcline `thenUgn` \ src_loc -> + returnUgn (ExprStmt expr src_loc) + + U_dobind pat exp srcline -> + wlkPat pat `thenUgn` \ patt -> + wlkExpr exp `thenUgn` \ expr -> + mkSrcLocUgn srcline `thenUgn` \ src_loc -> + returnUgn (BindStmt patt expr src_loc) + + U_seqlet seqlet -> + wlkBinding seqlet `thenUgn` \ bs -> + getSrcFileUgn `thenUgn` \ sf -> + let + binds = cvBinds sf cvValSig bs + in + returnUgn (LetStmt binds) + + U_comprh cexp cquals -> -- list comprehension + wlkExpr cexp `thenUgn` \ expr -> + wlkList rd_qual cquals `thenUgn` \ quals -> + returnUgn (ListComp expr quals) + where + rd_qual pt + = rdU_tree pt `thenUgn` \ qual -> + wlk_qual qual + + wlk_qual qual + = case qual of + U_guard exp -> + wlkExpr exp `thenUgn` \ expr -> + returnUgn (FilterQual expr) + + U_qual qpat qexp -> + wlkPat qpat `thenUgn` \ pat -> + wlkExpr qexp `thenUgn` \ expr -> + returnUgn (GeneratorQual pat expr) + + U_seqlet seqlet -> + wlkBinding seqlet `thenUgn` \ bs -> + getSrcFileUgn `thenUgn` \ sf -> + let + binds = cvBinds sf cvValSig bs + in + returnUgn (LetQual binds) + + U_eenum efrom estep eto -> -- arithmetic sequence + wlkExpr efrom `thenUgn` \ e1 -> + wlkMaybe rdExpr estep `thenUgn` \ es2 -> + wlkMaybe rdExpr eto `thenUgn` \ es3 -> + returnUgn (cv_arith_seq e1 es2 es3) + where + cv_arith_seq e1 Nothing Nothing = ArithSeqIn (From e1) + cv_arith_seq e1 Nothing (Just e3) = ArithSeqIn (FromTo e1 e3) + cv_arith_seq e1 (Just e2) Nothing = ArithSeqIn (FromThen e1 e2) + cv_arith_seq e1 (Just e2) (Just e3) = ArithSeqIn (FromThenTo e1 e2 e3) + + U_restr restre restrt -> -- expression with type signature + wlkExpr restre `thenUgn` \ expr -> + wlkPolyType restrt `thenUgn` \ ty -> + returnUgn (ExprWithTySig expr ty) + + -------------------------------------------------------------- + -- now the prefix items that can either be an expression or + -- pattern, except we know they are *expressions* here + -- (this code could be commoned up with the pattern version; + -- but it probably isn't worth it) + -------------------------------------------------------------- + U_lit lit -> + wlkLiteral lit `thenUgn` \ lit -> + returnUgn (HsLit lit) + + U_ident n -> -- simple identifier + wlkQid n `thenUgn` \ var -> + returnUgn (HsVar var) + + U_ap fun arg -> -- application + wlkExpr fun `thenUgn` \ expr1 -> + wlkExpr arg `thenUgn` \ expr2 -> + returnUgn (HsApp expr1 expr2) + + U_infixap fun arg1 arg2 -> -- infix application + wlkQid fun `thenUgn` \ op -> + wlkExpr arg1 `thenUgn` \ expr1 -> + wlkExpr arg2 `thenUgn` \ expr2 -> + returnUgn (OpApp expr1 (HsVar op) expr2) + + U_negate nexp _ _ -> -- prefix negation + wlkExpr nexp `thenUgn` \ expr -> + returnUgn (HsApp (HsVar (Unk SLIT("negate"))) expr) + + U_llist llist -> -- explicit list + wlkList rdExpr llist `thenUgn` \ exprs -> + returnUgn (ExplicitList exprs) + + U_tuple tuplelist -> -- explicit tuple + wlkList rdExpr tuplelist `thenUgn` \ exprs -> + returnUgn (ExplicitTuple exprs) + + U_record con rbinds -> -- record construction + wlkQid con `thenUgn` \ rcon -> + wlkList rdRbind rbinds `thenUgn` \ recbinds -> + returnUgn (RecordCon rcon recbinds) + + U_rupdate updexp updbinds -> -- record update + wlkExpr updexp `thenUgn` \ aexp -> + wlkList rdRbind updbinds `thenUgn` \ recbinds -> + returnUgn (RecordUpd aexp recbinds) + +#ifdef DEBUG + U_hmodule _ _ _ _ _ _ -> error "U_hmodule" + U_as _ _ -> error "U_as" + U_lazyp _ -> error "U_lazyp" + U_wildp -> error "U_wildp" + U_qual _ _ -> error "U_qual" + U_guard _ -> error "U_guard" + U_seqlet _ -> error "U_seqlet" + U_dobind _ _ _ -> error "U_dobind" + U_doexp _ _ -> error "U_doexp" + U_rbind _ _ -> error "U_rbind" + U_fixop _ _ _ -> error "U_fixop" +#endif + +rdRbind pt + = rdU_tree pt `thenUgn` \ (U_rbind var exp) -> + wlkQid var `thenUgn` \ rvar -> + wlkMaybe rdExpr exp `thenUgn` \ expr_maybe -> + returnUgn (rvar, expr_maybe) \end{code} Patterns: just bear in mind that lists of patterns are represented as a series of ``applications''. \begin{code} -rdPat sf (next_char:xs) - = case next_char of - 's' -> -- "as" pattern - BIND (rdId xs) _TO_ (id, xs1) -> - BIND (rdPat sf xs1) _TO_ (pat,xs2) -> - RETN (AsPatIn id pat, xs2) - BEND BEND - - '~' -> -- irrefutable ("twiddle") pattern - BIND (rdPat sf xs) _TO_ (pat,xs1) -> - RETN (LazyPatIn pat, xs1) - BEND - - '+' -> -- n+k pattern - BIND (rdPat sf xs) _TO_ (pat, xs1) -> - BIND (rdLiteral xs1) _TO_ (lit, xs2) -> - let - n = case pat of - VarPatIn n -> n - WildPatIn -> error "ERROR: rdPat: GHC can't handle _+k patterns yet" - in - RETN (NPlusKPatIn n lit, xs2) - BEND BEND - - '_' -> -- wildcard pattern - RETN (WildPatIn, xs) - - -------------------------------------------------------------- - -- now the prefix items that can either be an expression or - -- pattern, except we know they are *patterns* here. - -------------------------------------------------------------- - '-' -> BIND (rdPat sf xs) _TO_ (lit_pat, xs1) -> - case lit_pat of - LitPatIn lit -> RETN (LitPatIn (negLiteral lit), xs1) - _ -> panic "rdPat: bad negated pattern!" - BEND - - 'C' -> BIND (rdLiteral xs) _TO_ (lit, xs1) -> - RETN (LitPatIn lit, xs1) - BEND - - 'i' -> -- simple identifier - BIND (rdIdString xs) _TO_ (str, xs1) -> - RETN (if isConop str then - ConPatIn (Unk str) [] - else - VarPatIn (Unk str), - xs1) - BEND - - 'a' -> -- "application": there's a list of patterns lurking here! - BIND (rd_curried_pats xs) _TO_ (lpat:lpats, xs1) -> - BIND (rdPat sf xs1) _TO_ (rpat, xs2) -> - let - (n, llpats) - = case lpat of - VarPatIn x -> (x, []) - ConPatIn x [] -> (x, []) - ConOpPatIn x op y -> (op, [x, y]) - other -> -- sorry about the weedy msg; the parser missed this one - error (ppShow 100 (ppCat [ppStr "ERROR: an illegal `application' of a pattern to another one:", ppInterleave ppSP (map (ppr PprForUser) bad_app)])) - - arg_pats = llpats ++ lpats ++ [rpat] - bad_app = (lpat:lpats) ++ [rpat] - in - RETN (ConPatIn n arg_pats, xs2) - BEND BEND - where - rd_curried_pats ('a' : ys) - = BIND (rd_curried_pats ys) _TO_ (lpats, ys1) -> - BIND (rdPat sf ys1) _TO_ (rpat, ys2) -> - RETN (lpats ++ [rpat], ys2) - BEND BEND - rd_curried_pats ys - = BIND (rdPat sf ys) _TO_ (pat, ys1) -> - RETN ([pat], ys1) - BEND - - '@' -> -- operator application - BIND (rdPat sf xs) _TO_ (pat1, xs1) -> - BIND (rdId xs1) _TO_ (op, xs2) -> - BIND (rdPat sf xs2) _TO_ (pat2, xs3) -> - RETN (ConOpPatIn pat1 op pat2, xs3) - BEND BEND BEND - - ':' -> -- explicit list - BIND (rdList (rdPat sf) xs) _TO_ (pats, xs1) -> - RETN (ListPatIn pats, xs1) - BEND - - ',' -> -- explicit tuple - BIND (rdList (rdPat sf) xs) _TO_ (pats, xs1) -> - RETN (TuplePatIn pats, xs1) - BEND - -#ifdef DPH - 'O' -> -- explicitProcessor pattern - BIND (rdList (rdPat sf) xs) _TO_ (pats, xs1) -> - BIND (rdPat sf xs1) _TO_ (pat, xs2) -> - RETN (ProcessorPatIn pats pat, xs2) - BEND BEND -#endif {- Data Parallel Haskell -} - - huh -> panic ("ReadPrefix.rdPat:"++(next_char:xs)) +wlkPat pat + = case pat of + U_par pat -> -- parenthesised pattern + wlkPat pat + + U_as avar as_pat -> -- "as" pattern + wlkQid avar `thenUgn` \ var -> + wlkPat as_pat `thenUgn` \ pat -> + returnUgn (AsPatIn var pat) + + U_lazyp lazyp -> -- irrefutable ("twiddle") pattern + wlkPat lazyp `thenUgn` \ pat -> + returnUgn (LazyPatIn pat) + + U_wildp -> returnUgn WildPatIn -- wildcard pattern + + -------------------------------------------------------------- + -- now the prefix items that can either be an expression or + -- pattern, except we know they are *patterns* here. + -------------------------------------------------------------- + U_negate nexp _ _ -> -- negated pattern: must be a literal + wlkPat nexp `thenUgn` \ lit_pat -> + case lit_pat of + LitPatIn lit -> returnUgn (LitPatIn (negLiteral lit)) + _ -> panic "wlkPat: bad negated pattern!" + + U_lit lit -> -- literal pattern + wlkLiteral lit `thenUgn` \ lit -> + returnUgn (LitPatIn lit) + + U_ident nn -> -- simple identifier + wlkQid nn `thenUgn` \ n -> + returnUgn ( + if isConopPN n + then ConPatIn n [] + else VarPatIn n + ) + + U_ap l r -> -- "application": there's a list of patterns lurking here! + wlkPat r `thenUgn` \ rpat -> + collect_pats l [rpat] `thenUgn` \ (lpat,lpats) -> + let + (n, arg_pats) + = case lpat of + VarPatIn x -> (x, lpats) + ConPatIn x [] -> (x, lpats) + ConOpPatIn x op y -> (op, x:y:lpats) + _ -> -- sorry about the weedy msg; the parser missed this one + error (ppShow 100 (ppCat [ + ppStr "ERROR: an illegal `application' of a pattern to another one:", + ppInterleave ppSP (map (ppr PprForUser) (lpat:lpats))])) + in + returnUgn (ConPatIn n arg_pats) + where + collect_pats pat acc + = case pat of + U_ap l r -> + wlkPat r `thenUgn` \ rpat -> + collect_pats l (rpat:acc) + other -> + wlkPat other `thenUgn` \ pat -> + returnUgn (pat,acc) + + U_infixap fun arg1 arg2 -> + wlkQid fun `thenUgn` \ op -> + wlkPat arg1 `thenUgn` \ pat1 -> + wlkPat arg2 `thenUgn` \ pat2 -> + returnUgn (ConOpPatIn pat1 op pat2) + + U_llist llist -> -- explicit list + wlkList rdPat llist `thenUgn` \ pats -> + returnUgn (ListPatIn pats) + + U_tuple tuplelist -> -- explicit tuple + wlkList rdPat tuplelist `thenUgn` \ pats -> + returnUgn (TuplePatIn pats) + + U_record con rpats -> -- record destruction + wlkQid con `thenUgn` \ rcon -> + wlkList rdRpat rpats `thenUgn` \ recpats -> + returnUgn (RecPatIn rcon recpats) + where + rdRpat pt + = rdU_tree pt `thenUgn` \ (U_rbind var pat) -> + wlkQid var `thenUgn` \ rvar -> + wlkMaybe rdPat pat `thenUgn` \ pat_maybe -> + returnUgn (rvar, pat_maybe) \end{code} -OLD, MISPLACED NOTE: The extra DPH syntax above is defined such that -to the left of a \tr{<<-} or \tr{<<=} there has to be a processor (no -expressions). Therefore in the pattern matching below we are taking -this into consideration to create the @DrawGen@ whose fields are the -\tr{K} patterns, pat and the exp right of the generator. - \begin{code} -rdLiteral :: String -> RETN_TYPE (Literal, String) - -rdLiteral (tag : xs) - = BIND (rdString xs) _TO_ (x, zs) -> - let - s = _UNPK_ x - - as_char = chr ((read s) :: Int) - -- a char comes in as a number string - -- representing its ASCII code - as_integer = readInteger s -#if __GLASGOW_HASKELL__ <= 22 - as_rational = toRational ((read s)::Double) -#else -#ifdef __GLASGOW_HASKELL__ - as_rational = _readRational s -- non-std -#else - as_rational = ((read s)::Rational) -#endif -#endif - as_double = ((read s) :: Double) - in - case tag of { - '4' -> RETN (IntLit as_integer, zs); - 'F' -> RETN (FracLit as_rational, zs); - 'H' -> RETN (IntPrimLit as_integer, zs); -#if __GLASGOW_HASKELL__ <= 22 - 'J' -> RETN (DoublePrimLit as_double,zs); - 'K' -> RETN (FloatPrimLit as_double, zs); -#else - 'J' -> RETN (DoublePrimLit as_rational,zs); - 'K' -> RETN (FloatPrimLit as_rational, zs); -#endif - 'C' -> RETN (CharLit as_char, zs); - 'P' -> RETN (CharPrimLit as_char, zs); - 'S' -> RETN (StringLit x, zs); - 'V' -> RETN (StringPrimLit x, zs); - 'Y' -> RETN (LitLitLitIn x, zs) - } BEND +wlkLiteral :: U_literal -> UgnM HsLit + +wlkLiteral ulit + = returnUgn ( + case ulit of + U_integer s -> HsInt (as_integer s) + U_floatr s -> HsFrac (as_rational s) + U_intprim s -> HsIntPrim (as_integer s) + U_doubleprim s -> HsDoublePrim (as_rational s) + U_floatprim s -> HsFloatPrim (as_rational s) + U_charr s -> HsChar (as_char s) + U_charprim s -> HsCharPrim (as_char s) + U_string s -> HsString (as_string s) + U_stringprim s -> HsStringPrim (as_string s) + U_clitlit s _ -> HsLitLit (as_string s) + ) + where + as_char s = _HEAD_ s + as_integer s = readInteger (_UNPK_ s) + as_rational s = _readRational (_UNPK_ s) -- non-std + as_string s = s \end{code} %************************************************************************ %* * -\subsection[rdBinding]{rdBinding} +\subsection{wlkBinding} %* * %************************************************************************ \begin{code} -rdBinding :: SrcFile -> String -> RETN_TYPE (RdrBinding, String) - -rdBinding sf (next_char:xs) - = case next_char of - 'B' -> -- null binding - RETN (RdrNullBind, xs) - - 'A' -> -- "and" binding (just glue, really) - BIND (rdBinding sf xs) _TO_ (binding1, xs1) -> - BIND (rdBinding sf xs1) _TO_ (binding2, xs2) -> - RETN (RdrAndBindings binding1 binding2, xs2) - BEND BEND - - 't' -> -- "data" declaration - BIND (rdString xs) _TO_ (srcline, xs1) -> - BIND (rdContext xs1) _TO_ (ctxt, xs2) -> - BIND (rdList rdId xs2) _TO_ (derivings, xs3) -> - BIND (rdTyConAndTyVars xs3) _TO_ ((tycon, tyvars), xs4) -> - BIND (rdList (rdConDecl sf) xs4) _TO_ (cons, xs5) -> - BIND (rdDataPragma xs5) _TO_ (pragma, xs6) -> - let - src_loc = mkSrcLoc sf srcline - in - RETN (RdrTyData (TyData ctxt tycon tyvars cons derivings pragma src_loc), - xs6) - BEND BEND BEND BEND BEND BEND - - 'n' -> -- "type" declaration - BIND (rdString xs) _TO_ (srcline, xs1) -> - BIND (rdTyConAndTyVars xs1) _TO_ ((tycon, tyvars), xs2) -> - BIND (rdMonoType xs2) _TO_ (expansion, xs3) -> - BIND (rdTypePragma xs3) _TO_ (pragma, xs4) -> - let - src_loc = mkSrcLoc sf srcline - in - RETN (RdrTySynonym (TySynonym tycon tyvars expansion pragma src_loc), - xs4) - BEND BEND BEND BEND - - 'f' -> -- function binding - BIND (rdString xs) _TO_ (srcline, xs1) -> - BIND (rdList (rdMatch sf) xs1) _TO_ (matches, xs2) -> - RETN (RdrFunctionBinding (read (_UNPK_ srcline)) matches, xs2) - BEND BEND - - 'p' -> -- pattern binding - BIND (rdString xs) _TO_ (srcline, xs1) -> - BIND (rdList (rdMatch sf) xs1) _TO_ (matches, xs2) -> - RETN (RdrPatternBinding (read (_UNPK_ srcline)) matches, xs2) - BEND BEND - - '$' -> -- "class" declaration - BIND (rdString xs) _TO_ (srcline, xs1) -> - BIND (rdContext xs1) _TO_ (ctxt, xs2) -> - BIND (rdClassAssertTy xs2) _TO_ ((clas, tyvar), xs3) -> - BIND (rdBinding sf xs3) _TO_ (binding, xs4) -> - BIND (rdClassPragma xs4) _TO_ (pragma, xs5) -> - let - (class_sigs, class_methods) = sepDeclsIntoSigsAndBinds binding - - final_sigs = concat (map cvClassOpSig class_sigs) - final_methods = cvMonoBinds sf class_methods - - src_loc = mkSrcLoc sf srcline - in - RETN (RdrClassDecl - (ClassDecl ctxt clas tyvar final_sigs final_methods pragma src_loc), - xs5) - BEND BEND BEND BEND BEND - - '%' -> -- "instance" declaration - BIND (rdString xs) _TO_ (srcline, xs1) -> - BIND (rdContext xs1) _TO_ (ctxt, xs2) -> - BIND (rdId xs2) _TO_ (clas, xs3) -> - BIND (rdMonoType xs3) _TO_ (inst_ty, xs4) -> - BIND (rdBinding sf xs4) _TO_ (binding, xs5) -> - BIND (rdInstPragma xs5) _TO_ (modname_maybe, pragma, xs6) -> - let - (ss, bs) = sepDeclsIntoSigsAndBinds binding - binds = cvMonoBinds sf bs - uprags = concat (map cvInstDeclSig ss) - src_loc = mkSrcLoc sf srcline - in - case modname_maybe of { - Nothing -> - RETN (RdrInstDecl (\ orig_mod infor_mod here -> - InstDecl ctxt clas inst_ty binds here orig_mod infor_mod uprags pragma src_loc), - xs6); - Just orig_mod -> - RETN (RdrInstDecl (\ _ infor_mod here -> - InstDecl ctxt clas inst_ty binds here orig_mod infor_mod uprags pragma src_loc), - xs6) - } - BEND BEND BEND BEND BEND BEND - - 'D' -> -- "default" declaration - BIND (rdString xs) _TO_ (srcline,xs1) -> - BIND (rdList rdMonoType xs1) _TO_ (tys, xs2) -> - - RETN (RdrDefaultDecl (DefaultDecl tys (mkSrcLoc sf srcline)), - xs2) - BEND BEND - - '7' -> -- "import" declaration in an interface - BIND (rdString xs) _TO_ (srcline, xs1) -> - BIND (rdIdString xs1) _TO_ (mod, xs2) -> - BIND (rdList rdEntity xs2) _TO_ (entities, xs3) -> - BIND (rdList rdRenaming xs3) _TO_ (renamings, xs4) -> - let - src_loc = mkSrcLoc sf srcline - in - RETN (RdrIfaceImportDecl (IfaceImportDecl mod entities renamings src_loc), - xs4) - BEND BEND BEND BEND - - 'S' -> -- signature(-like) things, including user pragmas - rd_sig_thing sf xs +wlkBinding :: U_binding -> UgnM RdrBinding + +wlkBinding binding + = case binding of + U_nullbind -> -- null binding + returnUgn RdrNullBind + + U_abind a b -> -- "and" binding (just glue, really) + wlkBinding a `thenUgn` \ binding1 -> + wlkBinding b `thenUgn` \ binding2 -> + returnUgn (RdrAndBindings binding1 binding2) + + U_tbind tctxt ttype tcons tderivs srcline tpragma -> -- "data" declaration + wlkContext tctxt `thenUgn` \ ctxt -> + wlkTyConAndTyVars ttype `thenUgn` \ (tycon, tyvars) -> + wlkList rdConDecl tcons `thenUgn` \ cons -> + wlkDerivings tderivs `thenUgn` \ derivings -> + wlkDataPragma tpragma `thenUgn` \ pragmas -> + mkSrcLocUgn srcline `thenUgn` \ src_loc -> + returnUgn (RdrTyDecl (TyData ctxt tycon tyvars cons derivings pragmas src_loc)) + + U_ntbind ntctxt nttype ntcon ntderivs srcline ntpragma -> -- "newtype" declaration + wlkContext ntctxt `thenUgn` \ ctxt -> + wlkTyConAndTyVars nttype `thenUgn` \ (tycon, tyvars) -> + wlkList rdConDecl ntcon `thenUgn` \ con -> + wlkDerivings ntderivs `thenUgn` \ derivings -> + wlkDataPragma ntpragma `thenUgn` \ pragma -> + mkSrcLocUgn srcline `thenUgn` \ src_loc -> + returnUgn (RdrTyDecl (TyNew ctxt tycon tyvars con derivings pragma src_loc)) + + U_nbind nbindid nbindas srcline -> -- "type" declaration + wlkTyConAndTyVars nbindid `thenUgn` \ (tycon, tyvars) -> + wlkMonoType nbindas `thenUgn` \ expansion -> + mkSrcLocUgn srcline `thenUgn` \ src_loc -> + returnUgn (RdrTyDecl (TySynonym tycon tyvars expansion src_loc)) + + U_fbind fbindl srcline -> -- function binding + wlkList rdMatch fbindl `thenUgn` \ matches -> + mkSrcLocUgn srcline `thenUgn` \ src_loc -> + returnUgn (RdrFunctionBinding srcline matches) + + U_pbind pbindl srcline -> -- pattern binding + wlkList rdMatch pbindl `thenUgn` \ matches -> + mkSrcLocUgn srcline `thenUgn` \ src_loc -> + returnUgn (RdrPatternBinding srcline matches) + + U_cbind cbindc cbindid cbindw srcline cpragma -> -- "class" declaration + wlkContext cbindc `thenUgn` \ ctxt -> + wlkClassAssertTy cbindid `thenUgn` \ (clas, tyvar)-> + wlkBinding cbindw `thenUgn` \ binding -> + wlkClassPragma cpragma `thenUgn` \ pragma -> + mkSrcLocUgn srcline `thenUgn` \ src_loc -> + getSrcFileUgn `thenUgn` \ sf -> + let + (class_sigs, class_methods) = sepDeclsIntoSigsAndBinds binding + + final_sigs = concat (map cvClassOpSig class_sigs) + final_methods = cvMonoBinds sf class_methods + in + returnUgn (RdrClassDecl + (ClassDecl ctxt clas tyvar final_sigs final_methods pragma src_loc)) + + U_ibind from_source orig_mod -- "instance" declaration + ibindc iclas ibindi ibindw srcline ipragma -> + wlkContext ibindc `thenUgn` \ ctxt -> + wlkQid iclas `thenUgn` \ clas -> + wlkMonoType ibindi `thenUgn` \ inst_ty -> + wlkBinding ibindw `thenUgn` \ binding -> + wlkInstPragma ipragma `thenUgn` \ pragma -> + mkSrcLocUgn srcline `thenUgn` \ src_loc -> + getSrcFileUgn `thenUgn` \ sf -> + let + from_here = case from_source of { 0 -> False; 1 -> True } + (ss, bs) = sepDeclsIntoSigsAndBinds binding + binds = cvMonoBinds sf bs + uprags = concat (map cvInstDeclSig ss) + ctxt_inst_ty = HsPreForAllTy ctxt inst_ty + in + returnUgn (RdrInstDecl + (InstDecl clas ctxt_inst_ty binds from_here orig_mod uprags pragma src_loc)) + + U_dbind dbindts srcline -> -- "default" declaration + wlkList rdMonoType dbindts `thenUgn` \ tys -> + mkSrcLocUgn srcline `thenUgn` \ src_loc -> + returnUgn (RdrDefaultDecl (DefaultDecl tys src_loc)) + + U_mbind mod mbindimp srcline -> + -- "import" declaration in an interface + wlkList rdEntity mbindimp `thenUgn` \ entities -> + mkSrcLocUgn srcline `thenUgn` \ src_loc -> + returnUgn (RdrIfaceImportDecl (IfaceImportDecl mod entities src_loc)) + + U_mfbind fixes -> + -- "infix" declarations in an interface + wlkList rdFixOp fixes `thenUgn` \ fixities -> + returnUgn (RdrIfaceFixities fixities) + + a_sig_we_hope -> + -- signature(-like) things, including user pragmas + wlk_sig_thing a_sig_we_hope +\end{code} + +\begin{code} +wlkDerivings :: U_maybe -> UgnM (Maybe [ProtoName]) + +wlkDerivings (U_nothing) = returnUgn Nothing +wlkDerivings (U_just pt) + = rdU_list pt `thenUgn` \ ds -> + wlkList rdQid ds `thenUgn` \ derivs -> + returnUgn (Just derivs) \end{code} \begin{code} -rd_sig_thing sf (next_char:xs) - = case next_char of - 't' -> -- type signature - BIND (rdString xs) _TO_ (srcline, xs1) -> - BIND (rdList rdId xs1) _TO_ (vars, xs2) -> - BIND (rdPolyType xs2) _TO_ (poly_ty, xs3) -> - BIND (rdTySigPragmas xs3) _TO_ (pragma, xs4) -> - let - src_loc = mkSrcLoc sf srcline - in - RETN (RdrTySig vars poly_ty pragma src_loc, xs4) - BEND BEND BEND BEND - - 's' -> -- value specialisation user-pragma - BIND (rdString xs) _TO_ (srcline, xs1) -> - BIND (rdId xs1) _TO_ (var, xs2) -> - BIND (rdList rdPolyType xs2) _TO_ (tys, xs3) -> - let - src_loc = mkSrcLoc sf srcline - in - RETN (RdrSpecValSig [SpecSig var ty Nothing{-ToDo: using...s-} src_loc | ty <- tys], xs3) - BEND BEND BEND - - 'S' -> -- instance specialisation user-pragma - BIND (rdString xs) _TO_ (srcline, xs1) -> - BIND (rdId xs1) _TO_ (clas, xs2) -> - BIND (rdMonoType xs2) _TO_ (ty, xs3) -> - let - src_loc = mkSrcLoc sf srcline - in - RETN (RdrSpecInstSig (InstSpecSig clas ty src_loc), xs3) - BEND BEND BEND - - 'i' -> -- value inlining user-pragma - BIND (rdString xs) _TO_ (srcline, xs1) -> - BIND (rdId xs1) _TO_ (var, xs2) -> - BIND (rdList rdIdString xs2) _TO_ (howto, xs3) -> - let - src_loc = mkSrcLoc sf srcline - - guidance - = (case howto of { - [] -> id; - [x] -> trace "ignoring unfold howto" }) UnfoldAlways - in - RETN (RdrInlineValSig (InlineSig var guidance src_loc), xs3) - BEND BEND BEND - - 'd' -> -- value deforest user-pragma - BIND (rdString xs) _TO_ (srcline, xs1) -> - BIND (rdId xs1) _TO_ (var, xs2) -> - let - src_loc = mkSrcLoc sf srcline - in - RETN (RdrDeforestSig (DeforestSig var src_loc), xs2) - BEND BEND - - 'u' -> -- value magic-unfolding user-pragma - BIND (rdString xs) _TO_ (srcline, xs1) -> - BIND (rdId xs1) _TO_ (var, xs2) -> - BIND (rdIdString xs2) _TO_ (str, xs3) -> - let - src_loc = mkSrcLoc sf srcline - in - RETN (RdrMagicUnfoldingSig (MagicUnfoldingSig var str src_loc), xs3) - BEND BEND BEND - - 'a' -> -- abstract-type-synonym user-pragma - BIND (rdString xs) _TO_ (srcline, xs1) -> - BIND (rdId xs1) _TO_ (tycon, xs2) -> - let - src_loc = mkSrcLoc sf srcline - in - RETN (RdrAbstractTypeSig (AbstractTypeSig tycon src_loc), xs2) - BEND BEND - - 'd' -> -- data specialisation user-pragma - BIND (rdString xs) _TO_ (srcline, xs1) -> - BIND (rdId xs1) _TO_ (tycon, xs2) -> - BIND (rdList rdMonoType xs2) _TO_ (tys, xs3) -> - let - src_loc = mkSrcLoc sf srcline - spec_ty = MonoTyCon tycon tys - in - RETN (RdrSpecDataSig (SpecDataSig tycon spec_ty src_loc), xs3) - BEND BEND BEND +wlk_sig_thing (U_sbind sbindids sbindid srcline spragma) -- type signature + = wlkList rdQid sbindids `thenUgn` \ vars -> + wlkPolyType sbindid `thenUgn` \ poly_ty -> + wlkTySigPragmas spragma `thenUgn` \ pragma -> + mkSrcLocUgn srcline `thenUgn` \ src_loc -> + returnUgn (RdrTySig vars poly_ty pragma src_loc) + +wlk_sig_thing (U_vspec_uprag uvar vspec_tys srcline) -- value specialisation user-pragma + = wlkQid uvar `thenUgn` \ var -> + wlkList rd_ty_and_id vspec_tys `thenUgn` \ tys_and_ids -> + mkSrcLocUgn srcline `thenUgn` \ src_loc -> + returnUgn (RdrSpecValSig [SpecSig var ty using_id src_loc + | (ty, using_id) <- tys_and_ids ]) + where + rd_ty_and_id :: ParseTree -> UgnM (ProtoNamePolyType, Maybe ProtoName) + rd_ty_and_id pt + = rdU_binding pt `thenUgn` \ (U_vspec_ty_and_id vspec_ty vspec_id) -> + wlkPolyType vspec_ty `thenUgn` \ ty -> + wlkMaybe rdQid vspec_id `thenUgn` \ id_maybe -> + returnUgn(ty, id_maybe) + +wlk_sig_thing (U_ispec_uprag iclas ispec_ty srcline)-- instance specialisation user-pragma + = wlkQid iclas `thenUgn` \ clas -> + wlkMonoType ispec_ty `thenUgn` \ ty -> + mkSrcLocUgn srcline `thenUgn` \ src_loc -> + returnUgn (RdrSpecInstSig (SpecInstSig clas ty src_loc)) + +wlk_sig_thing (U_inline_uprag ivar srcline) -- value inlining user-pragma + = wlkQid ivar `thenUgn` \ var -> + mkSrcLocUgn srcline `thenUgn` \ src_loc -> + returnUgn (RdrInlineValSig (InlineSig var src_loc)) + +wlk_sig_thing (U_deforest_uprag ivar srcline) -- "deforest me" user-pragma + = wlkQid ivar `thenUgn` \ var -> + mkSrcLocUgn srcline `thenUgn` \ src_loc -> + returnUgn (RdrDeforestSig (DeforestSig var src_loc)) + +wlk_sig_thing (U_magicuf_uprag ivar str srcline) -- "magic" unfolding user-pragma + = wlkQid ivar `thenUgn` \ var -> + mkSrcLocUgn srcline `thenUgn` \ src_loc -> + returnUgn (RdrMagicUnfoldingSig (MagicUnfoldingSig var str src_loc)) + +wlk_sig_thing (U_dspec_uprag itycon dspec_tys srcline) + = wlkQid itycon `thenUgn` \ tycon -> + mkSrcLocUgn srcline `thenUgn` \ src_loc -> + wlkList rdMonoType dspec_tys `thenUgn` \ tys -> + let + spec_ty = MonoTyApp tycon tys + in + returnUgn (RdrSpecDataSig (SpecDataSig tycon spec_ty src_loc)) \end{code} %************************************************************************ %* * -\subsection[rdTypes]{Reading in types in various forms (and data constructors)} +\subsection[wlkTypes]{Reading in types in various forms (and data constructors)} %* * %************************************************************************ \begin{code} -rdPolyType :: String -> RETN_TYPE (ProtoNamePolyType, String) -rdMonoType :: String -> RETN_TYPE (ProtoNameMonoType, String) - -rdPolyType ('3' : xs) - = BIND (rdContext xs) _TO_ (ctxt, xs1) -> - BIND (rdMonoType xs1) _TO_ (ty, xs2) -> - RETN (OverloadedTy ctxt ty, xs2) - BEND BEND - -rdPolyType ('2' : 'C' : xs) - = BIND (rdList rdId xs) _TO_ (tvs, xs1) -> - BIND (rdMonoType xs1) _TO_ (ty, xs2) -> - RETN (ForAllTy tvs ty, xs2) - BEND BEND - -rdPolyType other - = BIND (rdMonoType other) _TO_ (ty, xs1) -> - RETN (UnoverloadedTy ty, xs1) - BEND - -rdMonoType ('T' : xs) - = BIND (rdId xs) _TO_ (tycon, xs1) -> - BIND (rdList rdMonoType xs1) _TO_ (tys, xs2) -> - RETN (MonoTyCon tycon tys, xs2) - BEND BEND - -rdMonoType (':' : xs) - = BIND (rdMonoType xs) _TO_ (ty, xs1) -> - RETN (ListMonoTy ty, xs1) - BEND - -rdMonoType (',' : xs) - = BIND (rdList rdPolyType xs) _TO_ (tys, xs1) -> - RETN (TupleMonoTy tys, xs1) - BEND - -rdMonoType ('>' : xs) - = BIND (rdMonoType xs) _TO_ (ty1, xs1) -> - BIND (rdMonoType xs1) _TO_ (ty2, xs2) -> - RETN (FunMonoTy ty1 ty2, xs2) - BEND BEND - -rdMonoType ('y' : xs) - = BIND (rdId xs) _TO_ (tyvar, xs1) -> - RETN (MonoTyVar tyvar, xs1) - BEND - -rdMonoType ('2' : 'A' : xs) - = BIND (rdId xs) _TO_ (clas, xs1) -> - BIND (rdMonoType xs1) _TO_ (ty, xs2) -> - RETN (MonoDict clas ty, xs2) - BEND BEND - -rdMonoType ('2' : 'B' : xs) - = BIND (rdId xs) _TO_ (tv_tmpl, xs1) -> - RETN (MonoTyVarTemplate tv_tmpl, xs1) - BEND - -#ifdef DPH -rdMonoType ('v' : xs) - = BIND (rdMonoType xs) _TO_ (ty, xs1) -> - RETN (RdrExplicitPodTy ty, xs1) - BEND - -rdMonoType ('u' : xs) - = BIND (rdList rdMonoType xs) _TO_ (tys, xs1) -> - BIND (rdMonoType xs1) _TO_ (ty, xs2) -> - RETN (RdrExplicitProcessorTy tys ty, xs2) - BEND BEND -#endif {- Data Parallel Haskell -} - -rdMonoType oops = panic ("rdMonoType:"++oops) +rdPolyType :: ParseTree -> UgnM ProtoNamePolyType +rdMonoType :: ParseTree -> UgnM ProtoNameMonoType + +rdPolyType pt = rdU_ttype pt `thenUgn` \ ttype -> wlkPolyType ttype +rdMonoType pt = rdU_ttype pt `thenUgn` \ ttype -> wlkMonoType ttype + +wlkPolyType :: U_ttype -> UgnM ProtoNamePolyType +wlkMonoType :: U_ttype -> UgnM ProtoNameMonoType + +wlkPolyType ttype + = case ttype of +{-LATER: + U_uniforall utvs uty -> -- forall type (pragmas) + wlkList rdU_unkId utvs `thenUgn` \ tvs -> + wlkMonoType uty `thenUgn` \ ty -> + returnUgn (HsForAllTy tvs ty) +-} + + U_context tcontextl tcontextt -> -- context + wlkContext tcontextl `thenUgn` \ ctxt -> + wlkMonoType tcontextt `thenUgn` \ ty -> + returnUgn (HsPreForAllTy ctxt ty) + + other -> -- something else + wlkMonoType other `thenUgn` \ ty -> + returnUgn (HsPreForAllTy [{-no context-}] ty) + +wlkMonoType ttype + = case ttype of + U_namedtvar tyvar -> -- type variable + returnUgn (MonoTyVar tyvar) + + U_tname tcon -> -- type constructor + wlkQid tcon `thenUgn` \ tycon -> + returnUgn (MonoTyApp tycon []) + + U_tapp t1 t2 -> + wlkMonoType t2 `thenUgn` \ ty2 -> + collect t1 [ty2] `thenUgn` \ (tycon, tys) -> + returnUgn (MonoTyApp tycon tys) + where + collect t acc + = case t of + U_tapp t1 t2 -> wlkMonoType t2 `thenUgn` \ ty2 -> + collect t1 (ty2:acc) + U_tname tcon -> wlkQid tcon `thenUgn` \ tycon -> + returnUgn (tycon, acc) + U_namedtvar tv -> returnUgn (tv, acc) + U_tllist _ -> panic "tlist" + U_ttuple _ -> panic "ttuple" + U_tfun _ _ -> panic "tfun" + U_tbang _ -> panic "tbang" + U_context _ _ -> panic "context" + _ -> panic "something else" + + U_tllist tlist -> -- list type + wlkMonoType tlist `thenUgn` \ ty -> + returnUgn (MonoListTy ty) + + U_ttuple ttuple -> + wlkList rdMonoType ttuple `thenUgn` \ tys -> + returnUgn (MonoTupleTy tys) + + U_tfun tfun targ -> + wlkMonoType tfun `thenUgn` \ ty1 -> + wlkMonoType targ `thenUgn` \ ty2 -> + returnUgn (MonoFunTy ty1 ty2) + + U_unidict uclas t -> -- DictTy (pragmas) + wlkQid uclas `thenUgn` \ clas -> + wlkMonoType t `thenUgn` \ ty -> + returnUgn (MonoDictTy clas ty) \end{code} \begin{code} -rdTyConAndTyVars :: String -> RETN_TYPE ((ProtoName, [ProtoName]), String) -rdContext :: String -> RETN_TYPE (ProtoNameContext, String) -rdClassAssertTy :: String -> RETN_TYPE ((ProtoName, ProtoName), String) +wlkTyConAndTyVars :: U_ttype -> UgnM (ProtoName, [ProtoName]) +wlkContext :: U_list -> UgnM ProtoNameContext +wlkClassAssertTy :: U_ttype -> UgnM (ProtoName, ProtoName) -rdTyConAndTyVars xs - = BIND (rdMonoType xs) _TO_ (MonoTyCon tycon ty_args, xs1) -> +wlkTyConAndTyVars ttype + = wlkMonoType ttype `thenUgn` \ (MonoTyApp tycon ty_args) -> let args = [ a | (MonoTyVar a) <- ty_args ] in - RETN ((tycon, args), xs1) - BEND + returnUgn (tycon, args) -rdContext xs - = BIND (rdList rdMonoType xs) _TO_ (tys, xs1) -> - RETN (map mk_class_assertion tys, xs1) - BEND +wlkContext list + = wlkList rdMonoType list `thenUgn` \ tys -> + returnUgn (map mk_class_assertion tys) -rdClassAssertTy xs - = BIND (rdMonoType xs) _TO_ (mono_ty, xs1) -> - RETN (mk_class_assertion mono_ty, xs1) - BEND +wlkClassAssertTy xs + = wlkMonoType xs `thenUgn` \ mono_ty -> + returnUgn (mk_class_assertion mono_ty) mk_class_assertion :: ProtoNameMonoType -> (ProtoName, ProtoName) -mk_class_assertion (MonoTyCon name [(MonoTyVar tyname)]) = (name, tyname) +mk_class_assertion (MonoTyApp name [(MonoTyVar tyname)]) = (name, tyname) mk_class_assertion other = error ("ERROR: malformed type context: "++ppShow 80 (ppr PprForUser other)++"\n") -- regrettably, the parser does let some junk past @@ -851,62 +754,103 @@ mk_class_assertion other \end{code} \begin{code} -rdConDecl :: SrcFile -> String -> RETN_TYPE (ProtoNameConDecl, String) - -rdConDecl sf ('1':xs) - = BIND (rdString xs) _TO_ (srcline, xs1) -> - BIND (rdId xs1) _TO_ (id, xs2) -> - BIND (rdList rdMonoType xs2) _TO_ (tys, xs3) -> - RETN (ConDecl id tys (mkSrcLoc sf srcline), xs3) - BEND BEND BEND +rdConDecl :: ParseTree -> UgnM ProtoNameConDecl +rdConDecl pt + = rdU_constr pt `thenUgn` \ blah -> + wlkConDecl blah + +wlkConDecl :: U_constr -> UgnM ProtoNameConDecl + +wlkConDecl (U_constrpre ccon ctys srcline) + = mkSrcLocUgn srcline `thenUgn` \ src_loc -> + wlkQid ccon `thenUgn` \ con -> + wlkList rdBangType ctys `thenUgn` \ tys -> + returnUgn (ConDecl con tys src_loc) + +wlkConDecl (U_constrinf cty1 cop cty2 srcline) + = mkSrcLocUgn srcline `thenUgn` \ src_loc -> + wlkBangType cty1 `thenUgn` \ ty1 -> + wlkQid cop `thenUgn` \ op -> + wlkBangType cty2 `thenUgn` \ ty2 -> + returnUgn (ConOpDecl ty1 op ty2 src_loc) + +wlkConDecl (U_constrnew ccon cty srcline) + = mkSrcLocUgn srcline `thenUgn` \ src_loc -> + wlkQid ccon `thenUgn` \ con -> + wlkMonoType cty `thenUgn` \ ty -> + returnUgn (NewConDecl con ty src_loc) + +wlkConDecl (U_constrrec ccon cfields srcline) + = mkSrcLocUgn srcline `thenUgn` \ src_loc -> + wlkQid ccon `thenUgn` \ con -> + wlkList rd_field cfields `thenUgn` \ fields_lists -> + returnUgn (RecConDecl con (concat fields_lists) src_loc) + where + rd_field :: ParseTree -> UgnM [(ProtoName, BangType ProtoName)] + rd_field pt + = rdU_constr pt `thenUgn` \ (U_field fvars fty) -> + wlkList rdQid fvars `thenUgn` \ vars -> + wlkBangType fty `thenUgn` \ ty -> + returnUgn [ (var, ty) | var <- vars ] + +----------------- +rdBangType pt = rdU_ttype pt `thenUgn` \ ty -> wlkBangType ty + +wlkBangType :: U_ttype -> UgnM (BangType ProtoName) + +wlkBangType (U_tbang bty) = wlkMonoType bty `thenUgn` \ ty -> returnUgn (Banged ty) +wlkBangType uty = wlkMonoType uty `thenUgn` \ ty -> returnUgn (Unbanged ty) + \end{code} %************************************************************************ %* * -\subsection[rdMatch]{Read a ``match''} +\subsection{Read a ``match''} %* * %************************************************************************ \begin{code} -rdMatch :: SrcFile -> String -> RETN_TYPE (RdrMatch, String) +rdMatch :: ParseTree -> UgnM RdrMatch -rdMatch sf ('W':xs) - = BIND (rdString xs) _TO_ (srcline, xs1) -> - BIND (rdIdString xs1) _TO_ (srcfun, xs2) -> - BIND (rdPat sf xs2) _TO_ (pat, xs3) -> - BIND (rdList rd_guarded xs3) _TO_ (grhss, xs4) -> - BIND (rdBinding sf xs4) _TO_ (binding, xs5) -> +rdMatch pt + = rdU_pbinding pt `thenUgn` \ (U_pgrhs gpat gdexprs gbind gsrcfun srcline) -> + + wlkPat gpat `thenUgn` \ pat -> + wlkBinding gbind `thenUgn` \ binding -> + wlkQid gsrcfun `thenUgn` \ srcfun -> + let + wlk_guards (U_pnoguards exp) + = wlkExpr exp `thenUgn` \ expr -> + returnUgn (RdrMatch_NoGuard srcline srcfun pat expr binding) - RETN (RdrMatch (read (_UNPK_ srcline)) srcfun pat grhss binding, xs5) - BEND BEND BEND BEND BEND + wlk_guards (U_pguards gs) + = wlkList rd_gd_expr gs `thenUgn` \ gd_exps -> + returnUgn (RdrMatch_Guards srcline srcfun pat gd_exps binding) + in + wlk_guards gdexprs where - rd_guarded xs - = BIND (rdExpr sf xs) _TO_ (g, xs1) -> - BIND (rdExpr sf xs1) _TO_ (e, xs2) -> - RETN ((g, e), xs2) - BEND BEND + rd_gd_expr pt + = rdU_pbinding pt `thenUgn` \ (U_pgdexp g e) -> + wlkExpr g `thenUgn` \ guard -> + wlkExpr e `thenUgn` \ expr -> + returnUgn (guard, expr) \end{code} %************************************************************************ %* * -\subsection[rdFixity]{Read in a fixity declaration} +\subsection[rdFixOp]{Read in a fixity declaration} %* * %************************************************************************ \begin{code} -rdFixity :: String -> RETN_TYPE (ProtoNameFixityDecl, String) -rdFixity xs - = BIND (rdId xs) _TO_ (op, xs1) -> - BIND (rdString xs1) _TO_ (associativity, xs2) -> - BIND (rdString xs2) _TO_ (prec_str, xs3) -> - let - precedence = read (_UNPK_ prec_str) - in - case (_UNPK_ associativity) of { - "infix" -> RETN (InfixN op precedence, xs3); - "infixl" -> RETN (InfixL op precedence, xs3); - "infixr" -> RETN (InfixR op precedence, xs3) - } BEND BEND BEND +rdFixOp :: ParseTree -> UgnM ProtoNameFixityDecl +rdFixOp pt + = rdU_tree pt `thenUgn` \ fix -> + case fix of + U_fixop op (-1) prec -> returnUgn (InfixL op prec) + U_fixop op 0 prec -> returnUgn (InfixN op prec) + U_fixop op 1 prec -> returnUgn (InfixR op prec) + _ -> error "ReadPrefix:rdFixOp" \end{code} %************************************************************************ @@ -916,81 +860,73 @@ rdFixity xs %************************************************************************ \begin{code} -rdImportedInterface :: FAST_STRING -> String - -> RETN_TYPE (ProtoNameImportedInterface, String) +rdImportedInterface :: ParseTree + -> UgnM ProtoNameImportedInterface + +rdImportedInterface pt + = rdU_binding pt + `thenUgn` \ (U_import ifname iffile binddef imod iqual ias ispec srcline) -> -rdImportedInterface importing_srcfile (x:xs) - = BIND (rdString xs) _TO_ (srcline, xs1) -> - BIND (rdString xs1) _TO_ (srcfile, xs2) -> - BIND (rdIdString xs2) _TO_ (modname, xs3) -> - BIND (rdList rdEntity xs3) _TO_ (imports, xs4) -> - BIND (rdList rdRenaming xs4) _TO_ (renamings,xs5) -> - BIND (rdBinding srcfile xs5) _TO_ (iface_bs, xs6) -> + mkSrcLocUgn srcline `thenUgn` \ src_loc -> + wlkMaybe rdU_stringId ias `thenUgn` \ maybe_as -> + wlkMaybe rd_spec ispec `thenUgn` \ maybe_spec -> + + setSrcFileUgn iffile ( -- looking inside the .hi file... + wlkBinding binddef + ) `thenUgn` \ iface_bs -> case (sepDeclsForInterface iface_bs) of { - (tydecls,classdecls,instdecls,sigs,iimpdecls) -> + (tydecls,classdecls,instdecls,sigs,iimpdecls,ifixities) -> let - expose_or_hide = case x of { 'e' -> ImportSome; 'h' -> ImportButHide } - - cv_iface - = MkInterface modname - iimpdecls - [{-fixity decls-}] -- can't get fixity decls in here yet (ToDo) - tydecls - classdecls - (cvInstDecls False SLIT(""){-probably superceded by modname < pragmas-} - modname instdecls) - -- False indicates imported - (concat (map cvValSig sigs)) - (mkSrcLoc importing_srcfile srcline) - in - RETN ( - (if null imports then - ImportAll cv_iface renamings - else - expose_or_hide cv_iface imports renamings - , xs6)) - } BEND BEND BEND BEND BEND BEND -\end{code} + cv_sigs = concat (map cvValSig sigs) -\begin{code} -rdRenaming :: String -> RETN_TYPE (Renaming, String) + cv_iface = Interface ifname iimpdecls ifixities + tydecls classdecls instdecls cv_sigs + src_loc -rdRenaming xs - = BIND (rdIdString xs) _TO_ (id1, xs1) -> - BIND (rdIdString xs1) _TO_ (id2, xs2) -> - RETN (MkRenaming id1 id2, xs2) - BEND BEND + cv_qual = case iqual of {0 -> False; 1 -> True} + in + returnUgn (ImportMod cv_iface cv_qual maybe_as maybe_spec) + } + where + rd_spec pt = rdU_either pt `thenUgn` \ spec -> + case spec of + U_left pt -> rdEntities pt `thenUgn` \ ents -> + returnUgn (False, ents) + U_right pt -> rdEntities pt `thenUgn` \ ents -> + returnUgn (True, ents) \end{code} \begin{code} -rdEntity :: String -> RETN_TYPE (IE, String) - -rdEntity inp - = case inp of - 'x':xs -> BIND (rdIdString xs) _TO_ (var, xs1) -> - RETN (IEVar var, xs1) - BEND - - 'X':xs -> BIND (rdIdString xs) _TO_ (thing, xs1) -> - RETN (IEThingAbs thing, xs1) - BEND - - 'z':xs -> BIND (rdIdString xs) _TO_ (thing, xs1) -> - RETN (IEThingAll thing, xs1) - BEND - - '8':xs -> BIND (rdIdString xs) _TO_ (tycon, xs1) -> - BIND (rdList rdString xs1) _TO_ (cons, xs2) -> - RETN (IEConWithCons tycon cons, xs2) - BEND BEND - - '9':xs -> BIND (rdIdString xs) _TO_ (c, xs1) -> - BIND (rdList rdString xs1) _TO_ (ops, xs2) -> - RETN (IEClsWithOps c ops, xs2) - BEND BEND - - 'm':xs -> BIND (rdIdString xs) _TO_ (m, xs1) -> - RETN (IEModuleContents m, xs1) - BEND +rdEntities pt + = rdU_list pt `thenUgn` \ list -> + wlkList rdEntity list + +rdEntity :: ParseTree -> UgnM (IE ProtoName) + +rdEntity pt + = rdU_entidt pt `thenUgn` \ entity -> + case entity of + U_entid evar -> -- just a value + wlkQid evar `thenUgn` \ var -> + returnUgn (IEVar var) + + U_enttype x -> -- abstract type constructor/class + wlkQid x `thenUgn` \ thing -> + returnUgn (IEThingAbs thing) + + U_enttypeall x -> -- non-abstract type constructor/class + wlkQid x `thenUgn` \ thing -> + returnUgn (IEThingAll thing) + + U_enttypenamed x ns -> -- non-abstract type constructor/class + -- with specified constrs/methods + wlkQid x `thenUgn` \ thing -> + wlkList rdQid ns `thenUgn` \ names -> + returnUgn (IEThingAll thing) + -- returnUgn (IEThingWith thing names) + + U_entmod mod -> -- everything provided by a module + returnUgn (IEModuleContents mod) \end{code} + |