|
|
1.1 root 1: (* Copyright 1989 by AT&T Bell Laboratories *)
2: structure Absyn = struct
3:
4: structure Basics = Basics
5:
6: local
7: open Access Basics BasicTypes
8: val whileSym = Symbol.symbol "while"
9: and argSym = Symbol.symbol "arg"
10: in
11:
12: open BareAbsyn
13:
14: val unitPat = RECORDpat{fields = nil, flex = false, typ = ref UNDEFty,
15: pats = ref nil}
16: val unitExp = RECORDexp nil
17:
18: val truePat = CONpat(trueDcon)
19: val trueExp = CONexp(trueDcon)
20: val falsePat = CONpat(falseDcon)
21: val falseExp = CONexp(falseDcon)
22:
23: val nilPat = CONpat(nilDcon)
24: val nilExp = CONexp(nilDcon)
25: val consPat = fn pat => APPpat(consDcon,pat)
26: val consExp = CONexp(consDcon)
27:
28: fun TUPLEexp l =
29: let fun addlabels(i,e::r) =
30: (LABEL{number=i-1, name=(Tuples.numlabel i)}, e) :: addlabels(i+1, r)
31: | addlabels(_, nil) = nil
32: in RECORDexp (addlabels(1,l))
33: end
34:
35: fun TUPLEpat l =
36: let fun addlabels(i,e::r) = (Tuples.numlabel i, e) :: addlabels(i+1, r)
37: | addlabels(_, nil) = nil
38: in RECORDpat{fields = addlabels(1,l), flex = false, typ = ref UNDEFty,
39: pats = ref nil}
40: end
41:
42: fun LISTexp l = fold (fn (e,rest) => APPexp(consExp,TUPLEexp[e,rest])) l nilExp
43:
44: fun IFexp (a,b,c) =
45: CASEexp(a, [RULE(truePat,b), RULE(falsePat,c)])
46:
47: fun ORELSEexp(a,b) =
48: IFexp(a,trueExp,b)
49:
50: fun ANDALSOexp(a,b) =
51: IFexp(a,b,falseExp)
52:
53: fun WHILEexp (a,b) =
54: let val tyref = ref UNDEFty
55: val lvar = namedLvar(whileSym)
56: val fb = VALvar{name=[whileSym],
57: access=LVAR(lvar),
58: typ=tyref}
59: val fa = VALvar{name=[whileSym],
60: access=PATH[lvar],
61: typ=tyref}
62: val id = fn x => x
63: val (markdec,markall,markend,markbody) =
64: case (a,b)
65: of (MARKexp(_,a1,a2), MARKexp(_,b1,b2)) =>
66: (fn e => MARKdec(e,a1,b2), fn e => MARKexp(e,a1,b2),
67: fn e => MARKexp(e,b2,b2), fn e => MARKexp(e,b1,b2))
68: | _ => (id,id,id,id)
69: in LETexp(
70: markdec(
71: VALRECdec[
72: RVB{var=fb,
73: exp=markall(FNexp[
74: RULE(unitPat,
75: markall(IFexp(a,
76: markbody (SEQexp[b, APPexp(markend(VARexp(ref fa)),
77: markend unitExp)]),
78: markend unitExp)))]),
79: resultty = NONE,
80: tyvars = nil}]),
81: APPexp(markall(VARexp (ref fa)), markend unitExp))
82: end
83:
84: fun LISTpat l = fold (fn (e,rest) => APPpat(consDcon, TUPLEpat[e,rest])) l nilPat
85:
86: fun FUNdec fbl =
87: let fun fb2rvb (FB {var, clauses as (CLAUSE{pats,...}::_),tyvars}) =
88: let fun getvars (hd::tl) = mkVALvar(argSym,ref UNDEFty) :: getvars tl
89: | getvars nil = nil;
90: val vars = getvars pats
91: fun not1(f,[a]) = a
92: | not1(f,l) = f l
93: fun dovar (VALvar{access=LVAR n,name,typ}) =
94: VARexp(ref(VALvar{access=PATH[n],name=name,typ=typ}))
95: | dovar _ = ErrorMsg.impossible "Absyn.FUNdec.dovar"
96:
97: fun doclause (CLAUSE{pats,exp,resultty=NONE}) =
98: RULE(not1(TUPLEpat,pats), exp)
99: | doclause (CLAUSE{pats,exp=MARKexp(exp',a,b),
100: resultty=SOME ty}) =
101: RULE(not1(TUPLEpat,pats),
102: MARKexp(CONSTRAINTexp(exp',ty),a,b))
103: | doclause (CLAUSE{pats,exp,resultty=SOME ty}) =
104: RULE(not1(TUPLEpat,pats),CONSTRAINTexp(exp,ty))
105:
106: fun last[x] = x | last (a::r) = last r
107: val mark = case (hd clauses, last clauses)
108: of (CLAUSE{exp=MARKexp(_,a,_),...},
109: CLAUSE{exp=MARKexp(_,_,b),...}) =>
110: (fn e => MARKexp(e,a,b))
111: | _ => fn e => e
112: fun makeexp [var] = FNexp(map doclause clauses)
113: | makeexp vars = fold
114: (fn (w,e) => FNexp[RULE(VARpat w,mark e)])
115: vars
116: (CASEexp(TUPLEexp(map dovar vars),
117: map doclause clauses))
118: in RVB {var=var,
119: exp=makeexp vars,
120: resultty=NONE,
121: tyvars=tyvars}
122: end
123: | fb2rvb _ = ErrorMsg.impossible "absyn.38"
124: in VALRECdec (map fb2rvb fbl)
125: end
126:
127: fun SELECTORexp id =
128: let val v = namedLvar id
129: val tyref = ref UNDEFty
130: val v1 = VALvar{name=[id],access=LVAR v, typ=tyref}
131: val v2 = VALvar{name=[id],access=PATH[v],typ=tyref}
132: in FNexp[RULE(RECORDpat{fields=[(id,VARpat v1)], flex=true,
133: typ= ref UNDEFty, pats=ref nil},
134: VARexp(ref v2))]
135: end
136:
137: end (* local open Access Basics ... *)
138: end (* structure Absyn *)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.