Annotation of researchv10no/cmd/sml/src/absyn/printabsyn.sml, revision 1.1.1.1

1.1       root        1: (* Copyright 1989 by AT&T Bell Laboratories *)
                      2: signature PRINTABSYN =
                      3: sig
                      4:     structure BareAbsyn : BAREABSYN
                      5:     val printPat : BareAbsyn.pat * int -> unit
                      6:     val printExp : BareAbsyn.exp * int * int -> unit
                      7:     val printRule : BareAbsyn.rule * int * int -> unit
                      8:     val printVB : BareAbsyn.vb * int * int -> unit
                      9:     val printRVB : BareAbsyn.rvb * int * int -> unit
                     10:     val printDec : BareAbsyn.dec * int * int -> unit
                     11:     val printStrexp : BareAbsyn.strexp * int * int -> unit
                     12: end
                     13: 
                     14: structure PrintAbsyn : PRINTABSYN = struct
                     15: structure BareAbsyn = BareAbsyn
                     16: open BareAbsyn Access Basics PrintUtil PrintType PrintBasics ErrorMsg Tuples
                     17: 
                     18: fun checkpat (n,nil) = true
                     19:   | checkpat (n, (sym,_)::fields) = 
                     20:     Symbol.eq(sym, numlabel n) andalso checkpat(n+1,fields)
                     21: 
                     22: fun checkexp (n,nil) = true
                     23:   | checkexp (n, (LABEL{name=sym,...},_)::fields) = 
                     24:        Symbol.eq(sym, numlabel n) andalso checkexp(n+1,fields)
                     25: 
                     26: fun isTUPLEpat (RECORDpat{fields=[_],...}) = false
                     27:   | isTUPLEpat (RECORDpat{flex=false,fields,...}) = checkpat(1,fields)
                     28:   | isTUPLEpat _ = false
                     29:        
                     30: fun isTUPLEexp (RECORDexp [_]) = false
                     31:   | isTUPLEexp (RECORDexp fields) = checkexp(1,fields)
                     32:   | isTUPLEexp _ = false
                     33: 
                     34: fun printPat (_,0) = print "<pat>"
                     35:   | printPat (VARpat v,_) = printVar v
                     36:   | printPat (WILDpat,_) = print "_"
                     37:   | printPat (INTpat i,_) = print i
                     38:   | printPat (REALpat r,_) = print r
                     39:   | printPat (STRINGpat s,_) = pr_mlstr s
                     40:   | printPat (LAYEREDpat (v,p),d) = (printPat(v,d); print " as "; printPat(p,d-1))
                     41:   | printPat (r as RECORDpat{fields,flex,...},d) =
                     42:     let val (a,b) =
                     43:        if isTUPLEpat r
                     44:        then (("(", ",", ")"), (fn (sym,pat) => printPat(pat,d-1)))
                     45:        else (("{", ",", (if flex then ",...}" else "}")),
                     46:               (fn (sym,pat) => (printSym sym; print "="; printPat(pat,d-1))))
                     47:     in printClosedSequence a b fields
                     48:     end
                     49:   | printPat (CONpat e,_) = printDcon e
                     50:   | printPat (p as APPpat _, d) =
                     51:        let val noparen = INfix(0,0)
                     52:        in  printDconPat(p,noparen,noparen,d)
                     53:        end
                     54:   | printPat (CONSTRAINTpat (p,t),d) = (printPat(p,d-1); print " : "; printType t)
                     55: 
                     56: and printDconPat(_,_,_,0) = print "<pat>"
                     57:   | printDconPat(CONpat(DATACON{name,...}),l:fixity,r:fixity,_) = printSym name
                     58:   | printDconPat(CONSTRAINTpat(p,t),l,r,d) =
                     59:        (print "("; printPat(p,d-1); print " : "; printType t; print ")")
                     60:   | printDconPat(LAYEREDpat(v,p),l,r,d) =
                     61:        (print "("; printPat(v,d); print " as "; printPat(p,d-1); print ")")
                     62:   | printDconPat(APPpat(DATACON{name,...},p),l,r,d) =
                     63:     let val dname = Symbol.name name
                     64:        val fixity = EnvAccess.lookFIX name
                     65:        fun prdcon() =
                     66:            case (fixity,isTUPLEpat p,p)
                     67:              of (INfix _,true,RECORDpat{fields=[(_,pl),(_,pr)],...}) =>
                     68:                         (printDconPat(pl,NONfix,fixity,d-1);
                     69:                          print " "; print dname; print " ";
                     70:                          printDconPat(pr,fixity,NONfix,d-1))
                     71:                | _ => (print dname; print " "; printDconPat(p,NONfix,NONfix,d-1))
                     72:     in  case(l,r,fixity) of
                     73:              (NONfix,NONfix,_) => (print "("; prdcon(); print ")")
                     74:            | (INfix _,INfix _,_) => prdcon()
                     75:            | (_,_,NONfix) => prdcon()
                     76:            | (INfix(_,p1),_,INfix(p2,_)) => if p1 >= p2
                     77:                                             then (print "("; prdcon(); print ")")
                     78:                                             else prdcon()
                     79:            | (_,INfix(p1,_),INfix(_,p2)) => if p1 > p2
                     80:                                             then (print "("; prdcon(); print ")")
                     81:                                             else prdcon()
                     82:     end
                     83:   | printDconPat (p,_,_,d) = printPat(p,d)
                     84: 
                     85: fun printExp(_,_,0) = print "<exp>"
                     86:   | printExp(VARexp(ref var),_,_) = printVar var
                     87:   | printExp(CONexp(con),_,_) = printDcon con
                     88:   | printExp(INTexp i,_,_) = print i
                     89:   | printExp(REALexp r,_,_) = print r
                     90:   | printExp(STRINGexp s,_,_) = pr_mlstr s
                     91:   | printExp(r as RECORDexp fields,ind,d) =
                     92:     let val (a,b) =
                     93:        if isTUPLEexp r
                     94:        then (("(", ",", ")"), (fn(_,exp)=>printExp(exp,ind+1,d-1)))
                     95:        else (("{", ",", "}"),
                     96:              (fn (LABEL{name,...},exp) =>
                     97:                  (printSym name; print "="; printExp(exp,ind+1,d))))
                     98:     in printClosedSequence a b fields
                     99:     end
                    100:   | printExp(SEQexp exps,ind,d) =
                    101:       printClosedSequence ("(", ";", ")") (fn exp => printExp(exp,ind+1,d-1)) exps
                    102:   | printExp(e as APPexp _,ind,d) = let val noparen = INfix(0,0)
                    103:                                    in  printAppExp(e,noparen,noparen,ind,d)
                    104:                                    end
                    105:   | printExp(CONSTRAINTexp(e, t),ind,d) =
                    106:       (print "("; printExp(e,ind,d); print ":"; printType t; print ")")
                    107:   | printExp(HANDLEexp(exp, HANDLER handler),ind,d) =
                    108:       (printExp(exp,ind,d-1); nlindent(ind); print "handle ";
                    109:        printExp(handler,ind+7,d-1))
                    110:   | printExp(RAISEexp exp,ind,d) = (print "raise "; printExp(exp,ind+6,d-1))
                    111:   | printExp(LETexp(dec, exp),ind,d) =
                    112:       (print "let "; printDec(dec,ind+4,d-1); nlindent(ind);
                    113:        print " in "; printExp(exp,ind+4,d-1); nlindent(ind);
                    114:        print "end")
                    115:   | printExp(CASEexp(exp, rules),ind,d) =
                    116:       (print "(case "; printExp(exp,ind+5,d-1); nlindent(ind+3);
                    117:        print "of "; printvseq (ind+4) "| " (fn r => printRule(r,ind+4,d-1)) rules;
                    118:        print ")")
                    119:   | printExp(FNexp rules,ind,d) =
                    120:       (print "(fn "; printvseq (ind+1) "| " (fn r => printRule(r,ind+3,d-1)) rules;
                    121:        print ")")
                    122:   | printExp(MARKexp (e,_,_),ind,d) = printExp(e,ind,d)
                    123: 
                    124: and printAppExp(_,_,_,_,0) = print "<exp>"
                    125:   | printAppExp arg =
                    126:     let fun fixityprint(name,e,l,r,ind,d) =
                    127:            let val dname = formatQid name
                    128:                val fixity = case name of [id] => EnvAccess.lookFIX id
                    129:                                        | _ => NONfix
                    130:                fun pr() =
                    131:                    case (fixity,isTUPLEexp e,e)
                    132:                      of (INfix _,true,RECORDexp[(_,pl),(_,pr)]) =>
                    133:                                 (printAppExp(pl,NONfix,fixity,ind,d-1);
                    134:                                  print " "; print dname; print " ";
                    135:                                  printAppExp(pr,fixity,NONfix,ind+2,d-1))
                    136:                        | _ => (print dname; print " ";
                    137:                                printAppExp(e,NONfix,NONfix,ind+2,d-1))
                    138:            in  case(l,r,fixity) of
                    139:                      (NONfix,NONfix,_) => (print "("; pr(); print ")")
                    140:                    | (INfix _,INfix _,_) => pr()
                    141:                    | (_,_,NONfix) => pr()
                    142:                    | (INfix(_,p1),_,INfix(p2,_)) =>
                    143:                                if p1 >= p2 then (print "("; pr(); print ")")
                    144:                                else pr()
                    145:                    | (_,INfix(p1,_),INfix(_,p2)) =>
                    146:                                if p1 > p2 then (print "("; pr(); print ")")
                    147:                                else pr()
                    148:            end
                    149:        fun appPrint(_,_,_,_,0) = print "#"
                    150:          | appPrint(CONSTRAINTexp(e,t),l,r,ind,d) =
                    151:              (print "("; printExp(e,ind+1,d-1);
                    152:               print " : "; printType t; print ")")
                    153:          | appPrint(APPexp(CONexp(DATACON{name,...}),e),l,r,ind,d) =
                    154:                fixityprint([name],e,l,r,ind,d)
                    155:          | appPrint(APPexp(VARexp(ref(VALvar{name,...})),e),l,r,ind,d) =
                    156:                fixityprint(name,e,l,r,ind,d)
                    157:          | appPrint(APPexp(VARexp(ref(OVLDvar{name,...})),e),l,r,ind,d) =
                    158:                fixityprint([name],e,l,r,ind,d)
                    159:          | appPrint(APPexp(app as APPexp _,rand),NONfix,NONfix,ind,d) =
                    160:                let val yesparen = INfix(0,100000000) (* a hack *)
                    161:                in  print "("; appPrint(app,yesparen,NONfix,ind+1,d-1);
                    162:                    print " ";
                    163:                    appPrint(rand,NONfix,NONfix,ind+2,d-1); print ")"
                    164:                end
                    165:          | appPrint(APPexp(app as APPexp _,rand),l,r,ind,d) =
                    166:                let val yesparen = INfix(0,100000000) (* a hack *)
                    167:                in  appPrint(app,yesparen,NONfix,ind+1,d-1);
                    168:                    print " ";
                    169:                    appPrint(rand,NONfix,NONfix,ind+2,d-1)
                    170:                end
                    171:          | appPrint(APPexp(rator,rand),_,_,ind,d) =
                    172:                (printExp(rator,ind,d-1); print " "; printExp(rand,ind+2,d-1))
                    173:          | appPrint(MARKexp(e,_,_),l,r,ind,d) = appPrint(e,l,r,ind,d)
                    174:          | appPrint (e,_,_,ind,d) = printExp(e,ind,d)
                    175:     in  appPrint arg
                    176:     end
                    177: 
                    178: and printRule(RULE(pat,exp),ind,d) =
                    179:     if d>0
                    180:     then (printPat(pat,d-1); print " => "; printExp(exp,ind+2,d-1))
                    181:     else print "<rule>"
                    182: 
                    183: and printVB(VB{pat,exp,...},ind,d) =
                    184:     if d>0
                    185:     then (printPat(pat,d-1); print " = "; printExp(exp,ind+2,d-1))
                    186:     else print "<binding>"
                    187: 
                    188: and printRVB(RVB{var,exp,...},ind,d) = 
                    189:     if d>0
                    190:     then (printVar var; print " = "; printExp(exp,ind+2,d-1))
                    191:     else print "<rec binding>"
                    192: 
                    193: and printDec(_,_,0) = print "<dec>"
                    194:   | printDec(VALdec vbs,ind,d) =
                    195:       (print "val "; printvseq ind "and " (fn vb => printVB(vb,ind+4,d-1)) vbs)
                    196:   | printDec(VALRECdec rvbs,ind,d) =
                    197:       (print "val rec "; 
                    198:        printvseq (ind+4) "and " (fn rvb => printRVB(rvb,ind+8,d-1)) rvbs)
                    199:   | printDec(TYPEdec tbs,ind,d) =
                    200:       (print "type ";
                    201:        printvseq ind " and "
                    202:          (fn (TB{tyc=ref(TYCON{path=name::_, arity,...}),def}) =>
                    203:             (case arity
                    204:                of 0 => ()
                    205:                 | 1 => (print "'a ")
                    206:                 | n => (printTuple print (typeFormals n); print " ");
                    207:              printSym name; print " = "; printType def)
                    208:           | _ => impossible "printabsyn.398")
                    209:         tbs)
                    210:   | printDec(DATATYPEdec{datatycs,withtycs},ind,d) =
                    211:       (print "datatype ";
                    212:        printvseq (ind+5) "and "
                    213:          (fn (ref(TYCON{path=name::_, arity, kind=DATAtyc dcons,...})) =>
                    214:             (case arity
                    215:                of 0 => ()
                    216:                 | 1 => (print "'a ")
                    217:                 | n => (printTuple print (typeFormals n); print " ");
                    218:              printSym name; print " = ";
                    219:              printSequence " | " (fn (DATACON{name,...}) => printSym name) dcons)
                    220:            | _ => impossible "printabsyn.8")
                    221:         datatycs;
                    222:        nlindent(ind); print "with"; printDec(TYPEdec withtycs,ind+4,d-1))
                    223:   | printDec(ABSTYPEdec _,ind,d) = print "abstype"
                    224:   | printDec(EXCEPTIONdec ebs,ind,d) =
                    225:       (print "exception ";
                    226:        printvseq (ind+6) "and "
                    227:          (fn (EBgen{exn=DATACON{name,...},etype}) =>
                    228:               (printSym name;
                    229:                case etype of NONE => ()
                    230:                            | SOME ty' => (print " of "; printType ty'))
                    231:           | (EBdef{exn=DATACON{name,...},edef=DATACON{name=dname,...}}) =>
                    232:               (printSym name; print "="; printSym dname))
                    233:         ebs)
                    234:   | printDec(STRdec sbs,ind,d) =
                    235:       (print "structure ";
                    236:        printvseq ind "and "
                    237:         (fn (STRB{strvar=STRvar{access,name,...},def,...}) =>
                    238:             (print(formatQid name); printAccess access; print " = "; nlindent(ind+4);
                    239:              printStrexp(def,ind+4,d-1)))
                    240:          sbs)
                    241:   | printDec(ABSdec sbs,ind,d) =
                    242:       (print "abstraction ";
                    243:        printvseq ind "and "
                    244:         (fn (STRB{strvar=STRvar{access,name,...},def,...}) =>
                    245:             (print(formatQid name); printAccess access; print " = "; nlindent(ind+4);
                    246:              printStrexp(def,ind+4,d-1)))
                    247:          sbs)
                    248:   | printDec(SIGdec sigvars,ind,d) =
                    249:       printvseq ind ""
                    250:        (fn SIGvar{name,...} => (print "signature "; printSym name))
                    251:        sigvars
                    252:   | printDec(LOCALdec(inner,outer),ind,d) =
                    253:       (print "local"; nlindent(ind+3);
                    254:        printDec(inner,ind+3,d-1); nlindent(ind);
                    255:        print "in ";
                    256:        printDec(outer,ind+3,d-1); nlindent(ind);
                    257:        print "end")
                    258:   | printDec(SEQdec decs,ind,d) =
                    259:       printvseq ind "" (fn dec => printDec(dec,ind,d)) decs
                    260:   | printDec(OPENdec strVars,ind,d) =
                    261:       (print "open ";
                    262:        printSequence " " (fn STRvar{name,...} => print(formatQid name)) strVars)
                    263:   | printDec(IMPORTdec _,_,_) = print "printDec gives up: IMPORT in abstract syntax"
                    264:   | printDec(MARKdec(dec,_,_),ind,d) = printDec(dec,ind,d)
                    265:   | printDec(_) = print "printDec gives up"
                    266: 
                    267: and printStrexp(_,_,0) = print "<strexp>"
                    268:   | printStrexp(VARstr(STRvar{access,name,...}),ind,d) = 
                    269:       print(formatQid name)
                    270:   | printStrexp(STRUCTstr{body,locations},ind,d) =
                    271:       (print "struct"; nlindent(ind+2);
                    272:        printvseq (ind+2) "" (fn dec => printDec(dec,ind+2,d-1)) body;
                    273:        nlindent(ind); print "end")
                    274:   | printStrexp(APPstr{oper=FCTvar{name,...}, argexp,...},ind,d) =
                    275:       (printSym name; print"(";
                    276:        printStrexp(argexp,ind+4,d-1);
                    277:        print")")
                    278:   | printStrexp(LETstr(dec,body),ind,d) =
                    279:       (print "let "; printDec(dec,ind+4,d-1); nlindent(ind);
                    280:        print " in "; printStrexp(body,ind+4,d-1); nlindent(ind);
                    281:        print "end")
                    282: 
                    283: end (* structure PrintAbsyn *)

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.