home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / sml_nj / 93src.lha / src / build / linkage.sml < prev    next >
Encoding:
Text File  |  1993-01-27  |  2.4 KB  |  66 lines

  1. signature LINKAGE = 
  2. sig
  3.   val getvars: Absyn.dec -> Access.lvar list
  4. end
  5.  
  6. structure Linkage : LINKAGE =
  7. struct
  8.  
  9.  (* functions for retrieving new bound lvars from declaration abstract syntax *)
  10.  
  11.   open Array List Access Variables Types Modules Absyn ErrorMsg
  12.   infix 9 sub
  13.  
  14.   fun smash f l = fold (fn (a,c) => f a @ c) l []
  15.  
  16.   fun patvars (VARpat(VALvar{access=PATH[v],...})) = [v]
  17.     | patvars (VARpat(VALvar{access=INLINE _,...})) = []
  18.     | patvars (VARpat _ ) = impossible "non-PATH in translate.patvars"
  19.     | patvars (RECORDpat{fields,...}) = smash (fn (_,p) => patvars p) fields
  20.     | patvars (VECTORpat (pats, _)) = smash patvars pats
  21.     | patvars (APPpat(_,_,p)) = patvars p
  22.     | patvars (CONSTRAINTpat(p,_)) = patvars p
  23.     | patvars (LAYEREDpat(p,q)) = patvars p @ patvars q
  24.     | patvars _ = []
  25.  
  26.   fun getvars (VALdec vbl) = smash (fn VB{pat,...} => patvars pat) vbl
  27.     | getvars (a as VALRECdec rvbl) =
  28.     smash (fn RVB{var=VALvar{access=PATH[var],...},exp,...} => [var]
  29.             | _ => impossible "#738 in translate")
  30.           rvbl
  31.     | getvars (LOCALdec (localdec,visibledec)) = 
  32.     (* it's necessary to "getvars localdec" in case the visibledec
  33.         contains an "open".  Yuck. *)
  34.         (getvars localdec @ getvars visibledec)
  35.     | getvars (EXCEPTIONdec ebl) =
  36.     map (fn EBgen{exn=DATACON{rep=VARIABLE(PATH[v]),...},...} => v
  37.           | EBdef{exn=DATACON{rep=VARIABLE(PATH[v]),...},...} => v
  38.           | EBgen{exn=DATACON{rep=VARIABLEc(PATH[v]),...},...} => v
  39.           | EBdef{exn=DATACON{rep=VARIABLEc(PATH[v]),...},...} => v
  40.           | _ => impossible "in getvars EXCEPTIONdec")
  41.         ebl
  42.     | getvars (SEQdec decl) = smash getvars decl
  43.     | getvars (DATATYPEdec _) = []
  44.     | getvars (ABSTYPEdec{body,...}) = getvars body
  45.     | getvars (TYPEdec _) = []
  46.     | getvars (STRdec sbl) =
  47.     map (fn STRB{strvar=STRvar{access=PATH[v],...},...} => v
  48.           | _ => impossible "getvars(STRdec)/fn"
  49.         ) sbl
  50.     | getvars (ABSdec sbl) =
  51.     map (fn STRB{strvar=STRvar{access=PATH[v],...},...} => v
  52.           | _ => impossible "getvars(ABSdec)/fn"
  53.         ) sbl
  54.     | getvars (FCTdec fbl) =
  55.     map (fn FCTB{fctvar=FCTvar{name,access=PATH[v],...},...} => v
  56.           | _ => impossible "getvars(FCTdec)/fn"
  57.         ) fbl
  58.     | getvars (FIXdec _) = []
  59.     | getvars (OVLDdec _) = []
  60.     | getvars (OPENdec _) = []
  61.     | getvars (SIGdec _) = []
  62.     | getvars (FSIGdec _) = []
  63.     | getvars (MARKdec (dec,_,_)) = getvars dec
  64.  
  65. end (* structure Linkage *)
  66.