Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Annotation of /branches/vis12/src/compiler/simplify/simple-pp.sml
ViewVC logotype

Annotation of /branches/vis12/src/compiler/simplify/simple-pp.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1992 - (view) (download)

1 : jhr 172 (* simple-pp.sml
2 :     *
3 : jhr 435 * COPYRIGHT (c) 2010 The Diderot Project (http://diderot-language.cs.uchicago.edu)
4 : jhr 172 * All rights reserved.
5 :     *
6 :     * Pretty printing for the Simple-AST representation.
7 :     *)
8 :    
9 :     structure SimplePP : sig
10 :    
11 :     val output : TextIO.outstream * Simple.program -> unit
12 :    
13 :     end = struct
14 :    
15 :     structure PP = TextIOPP
16 :     structure TU = TypeUtil
17 :     structure S = Simple
18 :    
19 :     val indent = PP.Abs 2
20 :    
21 :     fun ppList ppFn (left, sep, right) (ppStrm, list) = let
22 :     fun sp () = PP.space ppStrm 1
23 :     val string = PP.string ppStrm
24 :     fun pp [] = string right
25 :     | pp [x] = (ppFn(ppStrm, x); string right)
26 :     | pp (x::xs) = (ppFn(ppStrm, x); string sep; sp(); pp xs)
27 :     in
28 :     string left; pp list
29 :     end
30 :    
31 :     (* print type arguments; we use "#" to denote differentiation arguments, "$" to denote
32 :     * shape arguments, and "%" to denote dimension arguments.
33 :     *)
34 :     fun ppTyArgs (ppStrm, mvs) = let
35 :     val string = PP.string ppStrm
36 :     fun ppTyArg (_, mv) = (case mv
37 :     of Types.TYPE tv => string(TU.toString(TU.resolve tv))
38 :     | Types.DIFF dv => string("#"^TU.diffToString(TU.resolveDiff dv))
39 :     | Types.SHAPE sv => string("$"^TU.shapeToString(TU.resolveShape sv))
40 :     | Types.DIM dv => string("%"^TU.dimToString(TU.resolveDim dv))
41 :     (* end case *))
42 :     in
43 :     ppList ppTyArg ("<", ";", ">") (ppStrm, mvs)
44 :     end
45 :    
46 : jhr 175 fun ppVar (ppStrm, x) = PP.string ppStrm (Var.uniqueNameOf x)
47 : jhr 172
48 :     fun ppVarDecl ppStrm = let
49 :     fun sp () = PP.space ppStrm 1
50 :     val string = PP.string ppStrm
51 :     in
52 :     fn x => (
53 :     PP.openHBox ppStrm;
54 :     case Var.kindOf x
55 :     of S.InputVar => (string "input"; sp())
56 : jhr 511 | S.StrandOutputVar => (string "output"; sp())
57 : jhr 172 | _ => ()
58 :     (* end case *);
59 :     string(TU.toString(#2(Var.typeOf x))); sp(); string(Var.uniqueNameOf x); string ";";
60 :     PP.closeBox ppStrm)
61 :     end
62 :    
63 :     fun ppExp (ppStrm, e) = let
64 :     fun sp () = PP.space ppStrm 1
65 :     val string = PP.string ppStrm
66 : jhr 1640 fun var x = ppVar (ppStrm, x)
67 : jhr 395 fun ppIndex (ppStrm, NONE) = PP.string ppStrm ":"
68 :     | ppIndex (ppStrm, SOME i) = var i
69 : jhr 172 fun pp e = (case e
70 : jhr 1640 of S.E_Var x => var x
71 : jhr 172 | S.E_Lit lit => string (Literal.toString lit)
72 :     | S.E_Tuple es => ppArgs (ppStrm, es)
73 :     | S.E_Apply(f, [], args, _) => (var f; sp(); ppArgs (ppStrm, args))
74 :     | S.E_Apply(f, mvs, args, _) => (
75 :     var f; ppTyArgs (ppStrm, mvs); sp(); ppArgs (ppStrm, args))
76 :     | S.E_Cons es => (
77 :     ppList ppVar ("[", ",", "]") (ppStrm, es))
78 : jhr 1688 | S.E_Seq es => (
79 :     ppList ppVar ("{", ",", "}") (ppStrm, es))
80 : jhr 399 | S.E_Slice(x, indices, _) => (
81 : jhr 395 var x;
82 :     ppList ppIndex ("[", ",", "]") (ppStrm, indices))
83 : jhr 1301 | S.E_Input(ty, argName, desc, NONE) => (
84 :     string(concat["input(\"", argName, "\","]); sp();
85 :     string(concat["\"", String.toString desc, "\")"]))
86 :     | S.E_Input(ty, argName, desc, SOME default) => (
87 : jhr 221 string "inputWithDefault"; string "(";
88 : jhr 1301 string (concat["\"", argName, "\","]); sp();
89 :     string (concat["\"", String.toString desc, "\","]); sp();
90 : jhr 221 var default; string ")")
91 : jhr 1992 | S.E_InputNrrd(ty, argName, desc, NONE) => (
92 :     string(concat["inputNrrd(\"", argName, "\","]); sp();
93 :     string(concat["\"", String.toString desc, "\")"]))
94 :     | S.E_InputNrrd(ty, argName, desc, SOME dflt) => (
95 :     string "inputNrrdWithDefault"; string "(";
96 :     string (concat["\"", argName, "\","]); sp();
97 :     string (concat["\"", String.toString desc, "\","]); sp();
98 :     string (concat["\"", dflt, "\")"]))
99 : jhr 1687 | S.E_Coerce{srcTy, dstTy, x} => (
100 :     string "("; string(TU.toString dstTy); string ")"; var x)
101 : jhr 172 (* end case *))
102 :     in
103 :     pp e
104 :     end
105 :    
106 :     and ppArgs (ppStrm, args) = ppList ppVar ("(", ",", ")") (ppStrm, args)
107 :    
108 : jhr 1116 fun ppBlock (ppStrm, [], S.Block[]) = PP.string ppStrm "{ }"
109 :     | ppBlock (ppStrm, vars, S.Block stms) = let
110 : jhr 172 fun sp () = PP.space ppStrm 1
111 :     fun nl () = PP.newline ppStrm
112 :     val string = PP.string ppStrm
113 : jhr 1640 fun var x = ppVar (ppStrm, x)
114 : jhr 227 fun ppStmt stmt = (
115 :     nl();
116 :     case stmt
117 : jhr 1116 of S.S_Var x => (
118 : jhr 172 PP.openHBox ppStrm;
119 : jhr 1116 string(TU.toString(#2(Var.typeOf x))); sp(); var x; string ";";
120 :     PP.closeBox ppStrm)
121 :     | S.S_Assign(x, e) => (
122 :     PP.openHBox ppStrm;
123 : jhr 175 var x; sp(); string "="; sp(); ppExp(ppStrm, e); string ";";
124 : jhr 227 PP.closeBox ppStrm)
125 : jhr 197 | S.S_IfThenElse(x, S.Block[s1], S.Block[]) => (
126 : jhr 172 PP.openVBox ppStrm indent;
127 :     PP.openHBox ppStrm;
128 : jhr 175 string "if"; sp(); ppVar(ppStrm, x);
129 : jhr 172 PP.closeBox ppStrm;
130 :     ppStmt s1;
131 : jhr 227 PP.closeBox ppStrm)
132 : jhr 197 | S.S_IfThenElse(x, blk, S.Block[]) => (
133 : jhr 172 PP.openHBox ppStrm;
134 : jhr 175 string "if"; sp(); ppVar(ppStrm, x);
135 : jhr 197 sp(); ppBlock (ppStrm, [], blk);
136 : jhr 172 PP.closeBox ppStrm)
137 : jhr 197 | S.S_IfThenElse(x, S.Block[s1], S.Block[s2]) => (
138 : jhr 172 PP.openVBox ppStrm indent;
139 :     PP.openHBox ppStrm;
140 : jhr 175 string "if"; sp(); ppVar(ppStrm, x);
141 : jhr 172 PP.closeBox ppStrm;
142 :     ppStmt s1;
143 :     PP.closeBox ppStrm;
144 :     nl();
145 :     PP.openVBox ppStrm indent;
146 : jhr 1640 string "else";
147 : jhr 172 ppStmt s2;
148 : jhr 227 PP.closeBox ppStrm)
149 : jhr 197 | S.S_IfThenElse(x, blk1, blk2) => (
150 :     PP.openHBox ppStrm;
151 :     string "if"; sp(); ppVar(ppStrm, x);
152 :     sp(); ppBlock (ppStrm, [], blk1);
153 :     PP.closeBox ppStrm;
154 :     PP.openHBox ppStrm;
155 : jhr 1116 sp(); string "else"; sp(); ppBlock (ppStrm, [], blk2);
156 : jhr 197 PP.closeBox ppStrm)
157 : jhr 511 | S.S_New(strand, args) => (
158 : jhr 172 PP.openHBox ppStrm;
159 : jhr 511 string "new"; sp(); string(Atom.toString strand); sp();
160 : jhr 172 ppArgs (ppStrm, args); string ";";
161 : jhr 227 PP.closeBox ppStrm)
162 :     | S.S_Die => string "die;"
163 :     | S.S_Stabilize => string "stabilize;"
164 : jhr 1640 | S.S_Print args => (
165 :     PP.openHBox ppStrm;
166 :     string "print"; sp(); ppArgs (ppStrm, args); string ";";
167 :     PP.closeBox ppStrm;
168 :     nl())
169 : jhr 172 (* end case *))
170 :     in
171 :     PP.openVBox ppStrm (PP.Abs 0);
172 : jhr 227 string "{";
173 : jhr 172 PP.openVBox ppStrm indent;
174 : jhr 227 List.app (fn vdcl => (nl(); ppVarDecl ppStrm vdcl)) vars;
175 : jhr 172 List.app ppStmt stms;
176 :     PP.closeBox ppStrm;
177 : jhr 227 nl(); string "}";
178 : jhr 172 PP.closeBox ppStrm
179 :     end
180 :    
181 : jhr 1116 fun ppInit (ppStrm, S.Initially{isArray, rangeInit, iters, create}) = let
182 :     fun sp () = PP.space ppStrm 1
183 :     fun nl () = PP.newline ppStrm
184 :     val string = PP.string ppStrm
185 : jhr 1640 fun var x = ppVar (ppStrm, x)
186 : jhr 1116 val label = if isArray then "Array" else "Collection"
187 :     fun ppIters [] = let
188 :     val S.C_Create{argInit, name, args} = create
189 :     in
190 :     ppBlock (ppStrm, [], argInit); nl();
191 :     PP.openHBox ppStrm;
192 :     string "new"; sp(); string(Atom.toString name);
193 :     ppArgs (ppStrm, args); string ";";
194 :     PP.closeBox ppStrm
195 :     end
196 :     | ppIters ({param, lo, hi} :: iters) = (
197 :     PP.openVBox ppStrm indent;
198 :     PP.openHBox ppStrm;
199 :     string "for"; sp();
200 :     string(TU.toString(#2(Var.typeOf param))); sp(); var param;
201 :     sp(); string "="; sp(); var lo; sp(); string ".."; sp(); var hi;
202 :     PP.closeBox ppStrm;
203 :     nl();
204 :     ppIters iters;
205 :     PP.closeBox ppStrm)
206 :     in
207 :     PP.openVBox ppStrm indent;
208 :     string label; nl();
209 :     ppBlock (ppStrm, [], rangeInit); nl();
210 :     ppIters iters;
211 :     PP.closeBox ppStrm;
212 :     nl()
213 :     end
214 :    
215 : jhr 511 fun ppStrand ppStrm (S.Strand{name, params, state, stateInit, methods}) = let
216 : jhr 172 fun sp () = PP.space ppStrm 1
217 :     fun nl () = PP.newline ppStrm
218 :     val string = PP.string ppStrm
219 : jhr 1640 fun var x = ppVar (ppStrm, x)
220 : jhr 197 fun ppMethod (S.Method(name, body)) = (
221 : jhr 1640 nl(); string(StrandUtil.nameToString name); nl(); ppBlock (ppStrm, [], body))
222 : jhr 172 in
223 :     PP.openHBox ppStrm;
224 : jhr 511 string "strand"; sp(); string(Atom.toString name); sp();
225 : jhr 172 ppList (fn (_, x) => (string(TU.toString(#2(Var.typeOf x))); sp(); var x))
226 :     ("(", ",", ")") (ppStrm, params);
227 :     PP.closeBox ppStrm;
228 :     nl();
229 :     PP.openVBox ppStrm indent;
230 :     string "{";
231 : jhr 197 ppBlock (ppStrm, state, stateInit);
232 : jhr 172 List.app ppMethod methods;
233 :     PP.closeBox ppStrm;
234 :     nl();
235 :     string "}"; nl()
236 :     end
237 :    
238 : jhr 1116 fun output (outS, S.Program{globals, globalInit, strands, init}) = let
239 : jhr 172 val ppStrm = PP.openOut {dst = outS, wid = 120}
240 : jhr 227 fun nl () = PP.newline ppStrm
241 : jhr 172 in
242 :     PP.openVBox ppStrm (PP.Abs 0);
243 : jhr 227 PP.string ppStrm "/* Simplified Program start */"; nl();
244 : jhr 240 ppBlock (ppStrm, globals, globalInit);
245 : jhr 227 nl();
246 : jhr 1116 ppInit (ppStrm, init);
247 : jhr 511 List.app (ppStrand ppStrm) strands;
248 : jhr 172 PP.string ppStrm "/* Program end */"; PP.newline ppStrm;
249 :     PP.closeBox ppStrm;
250 :     PP.closeStream ppStrm
251 :     end
252 :    
253 :     end

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0