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

SCM Repository

[diderot] Annotation of /trunk/src/compiler/ast/ast-pp.sml
ViewVC logotype

Annotation of /trunk/src/compiler/ast/ast-pp.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 164 - (view) (download)

1 : jhr 93 (* ast-pp.sml
2 :     *
3 :     * COPYRIGHT (c) 2010 The Diderot Project (http://diderot.cs.uchicago.edu)
4 :     * All rights reserved.
5 : jhr 96 *
6 :     * Pretty printing for the AST representation.
7 : jhr 93 *)
8 :    
9 :     structure ASTPP : sig
10 :    
11 :     val output : TextIO.outstream * AST.program -> unit
12 :    
13 :     end = struct
14 :    
15 :     structure PP = TextIOPP
16 : jhr 96 structure TU = TypeUtil
17 : jhr 93
18 : jhr 94 val indent = PP.Abs 2
19 :    
20 :     fun ppList ppFn (left, sep, right) (ppStrm, list) = let
21 :     fun sp () = PP.space ppStrm 1
22 :     val string = PP.string ppStrm
23 :     fun pp [] = string right
24 :     | pp [x] = (ppFn(ppStrm, x); string right)
25 :     | pp (x::xs) = (ppFn(ppStrm, x); string sep; sp(); pp xs)
26 :     in
27 :     string left; pp list
28 :     end
29 :    
30 : jhr 96 (* print type arguments; we use "#" to denote differentiation arguments, "$" to denote
31 :     * shape arguments, and "%" to denote dimension arguments.
32 :     *)
33 :     fun ppTyArgs (ppStrm, mvs) = let
34 :     val string = PP.string ppStrm
35 :     fun ppTyArg (_, mv) = (case mv
36 :     of Types.TYPE tv => string(TU.toString(TU.resolve tv))
37 :     | Types.DIFF dv => string("#"^TU.diffToString(TU.resolveDiff dv))
38 :     | Types.SHAPE sv => string("$"^TU.shapeToString(TU.resolveShape sv))
39 :     | Types.DIM dv => string("%"^TU.dimToString(TU.resolveDim dv))
40 :     (* end case *))
41 :     in
42 :     ppList ppTyArg ("<", ";", ">") (ppStrm, mvs)
43 :     end
44 :    
45 : jhr 94 fun ppExp (ppStrm, e) = let
46 :     fun sp () = PP.space ppStrm 1
47 :     val string = PP.string ppStrm
48 :     fun var x = string(Var.nameOf x)
49 :     fun pp e = (case e
50 :     of AST.E_Var(x, [], _) => var x
51 : jhr 96 | AST.E_Var(x, mvs, ty) => (var x; ppTyArgs (ppStrm, mvs))
52 : jhr 94 | AST.E_Lit lit => string (Literal.toString lit)
53 :     | AST.E_Tuple es => ppArgs (ppStrm, es)
54 :     | AST.E_Apply(f, [], args, _) => (var f; sp(); ppArgs (ppStrm, args))
55 :     | AST.E_Apply(f, mvs, args, _) => (
56 : jhr 96 var f; ppTyArgs (ppStrm, mvs); sp(); ppArgs (ppStrm, args))
57 : jhr 94 | AST.E_Cons es => (
58 :     ppList ppExp ("[", ",", "]") (ppStrm, es))
59 :     | AST.E_Cond(e1, e2, e3) => (
60 :     pp e1; sp(); string "?"; sp(); pp e2; sp(); string ":"; sp(); pp e3)
61 :     (* end case *))
62 :     in
63 :     pp e
64 :     end
65 :    
66 :     and ppArgs (ppStrm, args) = ppList ppExp ("(", ",", ")") (ppStrm, args)
67 :    
68 :     fun ppVarDecl ppStrm (AST.VD_Decl(x, e)) = let
69 :     fun sp () = PP.space ppStrm 1
70 :     val string = PP.string ppStrm
71 :     fun var x = string(Var.nameOf x)
72 :     in
73 :     PP.openHBox ppStrm;
74 : jhr 96 string(TU.toString(#2(Var.typeOf x))); sp(); var x;
75 : jhr 94 sp(); string "="; sp(); ppExp(ppStrm, e); string ";";
76 :     PP.closeBox ppStrm
77 :     end
78 :    
79 : jhr 164 fun ppStateVarDecl ppStrm (isOutput, AST.VD_Decl(x, e)) = let
80 :     fun sp () = PP.space ppStrm 1
81 :     val string = PP.string ppStrm
82 :     fun var x = string(Var.nameOf x)
83 :     in
84 :     PP.openHBox ppStrm;
85 :     if isOutput then (string "output"; sp()) else ();
86 :     string(TU.toString(#2(Var.typeOf x))); sp(); var x;
87 :     sp(); string "="; sp(); ppExp(ppStrm, e); string ";";
88 :     PP.closeBox ppStrm
89 :     end
90 :    
91 : jhr 94 fun ppBlock (ppStrm, stms) = let
92 :     fun sp () = PP.space ppStrm 1
93 :     fun nl () = PP.newline ppStrm
94 :     val string = PP.string ppStrm
95 :     fun var x = string(Var.nameOf x)
96 :     fun ppStmt stmt = (case stmt
97 :     of AST.S_Block stms => ppBlock (ppStrm, stms)
98 :     | AST.S_Decl vdcl => (ppVarDecl ppStrm vdcl; nl())
99 :     | AST.S_IfThenElse(e, AST.S_Block stms, AST.S_Block[]) => (
100 :     PP.openHBox ppStrm;
101 :     string "if"; sp(); ppExp(ppStrm, e);
102 :     sp(); ppBlock (ppStrm, stms);
103 :     PP.closeBox ppStrm)
104 :     | AST.S_IfThenElse(e, s1, AST.S_Block[]) => (
105 :     PP.openVBox ppStrm indent;
106 :     PP.openHBox ppStrm;
107 :     string "if"; sp(); ppExp(ppStrm, e);
108 :     PP.closeBox ppStrm;
109 :     nl();
110 :     ppStmt s1;
111 :     PP.closeBox ppStrm;
112 :     nl())
113 :     | AST.S_IfThenElse(e, AST.S_Block stms1, AST.S_Block stms2) => (
114 :     PP.openHBox ppStrm;
115 :     string "if"; sp(); ppExp(ppStrm, e);
116 : jhr 103 sp(); ppBlock (ppStrm, stms1);
117 : jhr 94 PP.closeBox ppStrm;
118 :     PP.openHBox ppStrm;
119 : jhr 103 string "else"; sp(); ppBlock (ppStrm, stms2);
120 : jhr 94 PP.closeBox ppStrm)
121 :     | AST.S_IfThenElse(e, AST.S_Block stms1, s2) => raise Fail "FIXME"
122 :     | AST.S_IfThenElse(e, s1, AST.S_Block stms2) => raise Fail "FIXME"
123 :     | AST.S_IfThenElse(e, s1, s2) => (
124 :     PP.openVBox ppStrm indent;
125 :     PP.openHBox ppStrm;
126 :     string "if"; sp(); ppExp(ppStrm, e);
127 :     PP.closeBox ppStrm;
128 :     nl();
129 :     ppStmt s1;
130 :     PP.closeBox ppStrm;
131 :     nl();
132 :     PP.openVBox ppStrm indent;
133 :     string "else"; nl();
134 :     ppStmt s2;
135 :     PP.closeBox ppStrm;
136 :     nl())
137 :     | AST.S_Assign(x, e) => (
138 :     PP.openHBox ppStrm;
139 :     var x; sp(); string "="; sp(); ppExp(ppStrm, e); string ";";
140 :     PP.closeBox ppStrm;
141 :     nl())
142 :     | AST.S_New(actor, args) => (
143 :     PP.openHBox ppStrm;
144 :     string "new"; sp(); string(Atom.toString actor); sp();
145 :     ppArgs (ppStrm, args); string ";";
146 :     PP.closeBox ppStrm;
147 :     nl())
148 :     | AST.S_Die => (string "die;"; nl())
149 :     | AST.S_Stabilize => (string "stabilize;"; nl())
150 :     (* end case *))
151 :     in
152 :     PP.openVBox ppStrm (PP.Abs 0);
153 :     string "{"; nl();
154 :     PP.openVBox ppStrm indent;
155 :     List.app ppStmt stms;
156 :     PP.closeBox ppStrm;
157 :     string "}"; nl();
158 :     PP.closeBox ppStrm
159 :     end
160 :    
161 :     fun ppActor (ppStrm, {name, params, state, methods}) = let
162 :     fun sp () = PP.space ppStrm 1
163 :     fun nl () = PP.newline ppStrm
164 :     val string = PP.string ppStrm
165 :     fun var x = string(Var.nameOf x)
166 :     fun ppMethod (AST.M_Method(name, AST.S_Block stms)) = (
167 :     nl(); string(Atom.toString name); nl(); ppBlock (ppStrm, stms))
168 :     | ppMethod (AST.M_Method(name, stm)) = (
169 :     nl(); string(Atom.toString name); nl(); ppBlock (ppStrm, [stm]))
170 :     in
171 :     PP.openHBox ppStrm;
172 :     string "actor"; sp(); string(Atom.toString name); sp();
173 : jhr 96 ppList (fn (_, x) => (string(TU.toString(#2(Var.typeOf x))); sp(); var x))
174 : jhr 94 ("(", ",", ")") (ppStrm, params);
175 :     PP.closeBox ppStrm;
176 :     nl();
177 :     PP.openVBox ppStrm indent;
178 :     string "{";
179 : jhr 164 List.app (fn vdcl => (nl(); ppStateVarDecl ppStrm vdcl)) state;
180 : jhr 94 List.app ppMethod methods;
181 :     PP.closeBox ppStrm;
182 :     nl();
183 :     string "}"; nl()
184 :     end
185 :    
186 :     fun ppDecl ppStrm = let
187 :     fun sp () = PP.space ppStrm 1
188 :     fun nl () = PP.newline ppStrm
189 :     val string = PP.string ppStrm
190 :     fun var x = string(Var.nameOf x)
191 :     in
192 :     fn AST.D_Input(x, NONE) => (
193 :     PP.openHBox ppStrm;
194 :     string "input"; sp();
195 : jhr 96 string(TU.toString(#2(Var.typeOf x))); sp(); var x; string ";";
196 : jhr 94 PP.closeBox ppStrm;
197 :     nl())
198 :     | AST.D_Input(x, SOME e) => (
199 :     PP.openHBox ppStrm;
200 :     string "input"; sp();
201 : jhr 96 string(TU.toString(#2(Var.typeOf x))); sp(); var x;
202 : jhr 94 sp(); string "="; sp(); ppExp(ppStrm, e); string ";";
203 :     PP.closeBox ppStrm;
204 :     nl())
205 :     | AST.D_Var vdcl => (ppVarDecl ppStrm vdcl; nl())
206 :     | AST.D_Actor def => ppActor (ppStrm, def)
207 :     | AST.D_InitialArray(create, iters) => (* FIXME *) ()
208 :     | AST.D_InitialCollection(create, iters) => (* FIXME *) ()
209 :     end
210 :    
211 :     fun output (outS, AST.Program decls) = let
212 : jhr 93 val ppStrm = PP.openOut {dst = outS, wid = 120}
213 :     in
214 : jhr 94 PP.openVBox ppStrm (PP.Abs 0);
215 :     PP.string ppStrm "/* Program start */"; PP.newline ppStrm;
216 :     List.app (ppDecl ppStrm) decls;
217 :     PP.string ppStrm "/* Program end */"; PP.newline ppStrm;
218 :     PP.closeBox ppStrm;
219 : jhr 93 PP.closeStream ppStrm
220 :     end
221 :    
222 :     end

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