summaryrefslogtreecommitdiff
path: root/ghc/compiler/reader/ReadPrefix.lhs
diff options
context:
space:
mode:
authorpartain <unknown>1996-01-08 20:28:12 +0000
committerpartain <unknown>1996-01-08 20:28:12 +0000
commite7d21ee4f8ac907665a7e170c71d59e13a01da09 (patch)
tree93715bf4e6e4bbe8049e4d8d4d3fbd19158a88d6 /ghc/compiler/reader/ReadPrefix.lhs
parente48474bff05e6cfb506660420f025f694c870d38 (diff)
downloadhaskell-e7d21ee4f8ac907665a7e170c71d59e13a01da09.tar.gz
[project @ 1996-01-08 20:28:12 by partain]
Initial revision
Diffstat (limited to 'ghc/compiler/reader/ReadPrefix.lhs')
-rw-r--r--ghc/compiler/reader/ReadPrefix.lhs996
1 files changed, 996 insertions, 0 deletions
diff --git a/ghc/compiler/reader/ReadPrefix.lhs b/ghc/compiler/reader/ReadPrefix.lhs
new file mode 100644
index 0000000000..5458884e66
--- /dev/null
+++ b/ghc/compiler/reader/ReadPrefix.lhs
@@ -0,0 +1,996 @@
+%
+% (c) The GRASP/AQUA Project, Glasgow University, 1992-1995
+%
+\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).
+
+\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
+
+IMPORT_Trace -- ToDo: rm (debugging)
+import Pretty
+
+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
+import ReadPragmas
+import SrcLoc ( mkSrcLoc )
+import Util
+\end{code}
+
+%************************************************************************
+%* *
+\subsection[ReadPrefix-help]{Help Functions}
+%* *
+%************************************************************************
+
+\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
+
+ my_rev "" acc = RETN acc -- instead of reverse, so can see on heap-profiles
+ my_rev (x:xs) acc = my_rev xs (x:acc)
+\end{code}
+
+%************************************************************************
+%* *
+\subsection[rdModule]{@rdModule@: reads in a Haskell module}
+%* *
+%************************************************************************
+
+\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, _) ->
+
+ 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
+ }
+ where
+ 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 )
+ }
+\end{code}
+
+%************************************************************************
+%* *
+\subsection[rdExprOrPat]{@rdExpr@ and @rdPat@}
+%* *
+%************************************************************************
+
+\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))
+\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))
+\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
+\end{code}
+
+%************************************************************************
+%* *
+\subsection[rdBinding]{rdBinding}
+%* *
+%************************************************************************
+
+\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
+\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
+\end{code}
+
+%************************************************************************
+%* *
+\subsection[rdTypes]{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)
+\end{code}
+
+\begin{code}
+rdTyConAndTyVars :: String -> RETN_TYPE ((ProtoName, [ProtoName]), String)
+rdContext :: String -> RETN_TYPE (ProtoNameContext, String)
+rdClassAssertTy :: String -> RETN_TYPE ((ProtoName, ProtoName), String)
+
+rdTyConAndTyVars xs
+ = BIND (rdMonoType xs) _TO_ (MonoTyCon tycon ty_args, xs1) ->
+ let
+ args = [ a | (MonoTyVar a) <- ty_args ]
+ in
+ RETN ((tycon, args), xs1)
+ BEND
+
+rdContext xs
+ = BIND (rdList rdMonoType xs) _TO_ (tys, xs1) ->
+ RETN (map mk_class_assertion tys, xs1)
+ BEND
+
+rdClassAssertTy xs
+ = BIND (rdMonoType xs) _TO_ (mono_ty, xs1) ->
+ RETN (mk_class_assertion mono_ty, xs1)
+ BEND
+
+mk_class_assertion :: ProtoNameMonoType -> (ProtoName, ProtoName)
+
+mk_class_assertion (MonoTyCon 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
+ -- e.g., f :: Num {-nothing-} => a -> ...
+\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
+\end{code}
+
+%************************************************************************
+%* *
+\subsection[rdMatch]{Read a ``match''}
+%* *
+%************************************************************************
+
+\begin{code}
+rdMatch :: SrcFile -> String -> RETN_TYPE (RdrMatch, String)
+
+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) ->
+
+ RETN (RdrMatch (read (_UNPK_ srcline)) srcfun pat grhss binding, xs5)
+ BEND BEND BEND BEND BEND
+ where
+ rd_guarded xs
+ = BIND (rdExpr sf xs) _TO_ (g, xs1) ->
+ BIND (rdExpr sf xs1) _TO_ (e, xs2) ->
+ RETN ((g, e), xs2)
+ BEND BEND
+\end{code}
+
+%************************************************************************
+%* *
+\subsection[rdFixity]{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
+\end{code}
+
+%************************************************************************
+%* *
+\subsection[rdImportedInterface]{Read an imported interface}
+%* *
+%************************************************************************
+
+\begin{code}
+rdImportedInterface :: FAST_STRING -> String
+ -> RETN_TYPE (ProtoNameImportedInterface, String)
+
+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) ->
+
+ case (sepDeclsForInterface iface_bs) of {
+ (tydecls,classdecls,instdecls,sigs,iimpdecls) ->
+ 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}
+
+\begin{code}
+rdRenaming :: String -> RETN_TYPE (Renaming, String)
+
+rdRenaming xs
+ = BIND (rdIdString xs) _TO_ (id1, xs1) ->
+ BIND (rdIdString xs1) _TO_ (id2, xs2) ->
+ RETN (MkRenaming id1 id2, xs2)
+ BEND BEND
+\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
+\end{code}