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

SCM Repository

[diderot] Diff of /branches/staging/src/compiler/cl-target/print-as-cl.sml
ViewVC logotype

Diff of /branches/staging/src/compiler/cl-target/print-as-cl.sml

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

trunk/src/compiler/cl-target/print-as-cl.sml revision 1640, Wed Nov 16 02:19:51 2011 UTC branches/staging/src/compiler/cl-target/print-as-cl.sml revision 2746, Wed Oct 1 21:08:30 2014 UTC
# Line 1  Line 1 
1  (* print-as-cl.sml  (* print-as-cl.sml
2   *   *
3   * COPYRIGHT (c) 2011 The Diderot Project (http://diderot-language.cs.uchicago.edu)   * COPYRIGHT (c) 2014 The Diderot Project (http://diderot-language.cs.uchicago.edu)
4   * All rights reserved.   * All rights reserved.
5   *   *
6   * Print the CLang representation using OpenCL syntax.   * Print the CLang representation using OpenCL syntax.
# Line 23  Line 23 
23    
24      type strm = PP.stream      type strm = PP.stream
25    
26        val indent0 = (PP.Abs 0)
27      val indent = (PP.Abs 4)     (* standard indentation amount *)      val indent = (PP.Abs 4)     (* standard indentation amount *)
28    
29      fun new outs = PP.openOut {dst = outs, wid = 90}      fun new outs = PP.openOut {dst = outs, wid = 120}
30    
31      val close = PP.closeStream      val close = PP.closeStream
32    
# Line 33  Line 34 
34            val str = PP.string strm            val str = PP.string strm
35            fun sp () = PP.space strm 1            fun sp () = PP.space strm 1
36            fun inHBox f = (PP.openHBox strm; f(); PP.closeBox strm)            fun inHBox f = (PP.openHBox strm; f(); PP.closeBox strm)
37            fun ppComLn s = (            fun ppCom s = inHBox (fn () => (str "// "; str s))
38                  inHBox (fn () => (str "// "; str s));            fun ppComLn s = (ppCom s; PP.newline strm)
                 PP.newline strm)  
39            fun ppList {pp, sep, l} = let            fun ppList {pp, sep, l} = let
40                  fun ppList' [] = ()                  fun ppList' [] = ()
41                    | ppList' [x] = pp x                    | ppList' [x] = pp x
# Line 89  Line 89 
89                  ppList {pp=str, sep=sp, l = attrs};                  ppList {pp=str, sep=sp, l = attrs};
90                  sp())                  sp())
91            fun ppDecl dcl = (case dcl            fun ppDecl dcl = (case dcl
92                   of CL.D_Comment l => List.app ppComLn l                   of CL.D_Pragma l => (
93                          inHBox (fn () => (
94                            str "#pragma";
95                            List.app (fn s => (sp(); str s)) l));
96                          PP.newline strm)
97                      | CL.D_Comment l => List.app ppComLn l
98                    | CL.D_Verbatim l => List.app str l                    | CL.D_Verbatim l => List.app str l
99                    | CL.D_Var(attrs, ty, x, optInit) => (                    | CL.D_Var(attrs, ty, x, optInit) => (
100                        inHBox (fn () => (                        inHBox (fn () => (
# Line 101  Line 106 
106                          (* end case *);                          (* end case *);
107                          str ";"));                          str ";"));
108                        PP.newline strm)                        PP.newline strm)
109                      | CL.D_Proto(attrs, ty, f, params) => (
110                          inHBox (fn () => (
111                            ppAttrs attrs;
112                            ppTy(ty, SOME f);
113                            sp(); str "(";
114                            ppList {pp=ppParam, sep=fn () => (str ","; sp()), l=params};
115                            str ");"));
116                          PP.newline strm)
117                    | CL.D_Func(attrs, ty, f, params, body) => (                    | CL.D_Func(attrs, ty, f, params, body) => (
118                          PP.openVBox strm indent0;
119                        inHBox (fn () => (                        inHBox (fn () => (
120                          ppAttrs attrs;                          ppAttrs attrs;
121                          ppTy(ty, SOME f);                          ppTy(ty, SOME f);
# Line 109  Line 123 
123                          ppList {pp=ppParam, sep=fn () => (str ","; sp()), l=params};                          ppList {pp=ppParam, sep=fn () => (str ","; sp()), l=params};
124                          str ")"));                          str ")"));
125                        PP.newline strm;                        PP.newline strm;
126                        ppBlock (case body of CL.S_Block stms => stms | stm => [stm]))                          ppBlock (case body of CL.S_Block stms => stms | stm => [stm]);
127                    | CL.D_StructDef(fields, tyName) => (                        PP.closeBox strm;
128                          PP.newline strm)
129                      | CL.D_StructDef(SOME name, fields, NONE) => (
130                          PP.openVBox strm indent0;
131                            inHBox (fn () => (str "struct"; sp(); str name; sp(); str "{"));
132                            PP.openVBox strm indent;
133                              List.app (fn (ty, x) => (
134                                  PP.newline strm;
135                                  inHBox (fn () => (ppTy(ty, SOME x); str ";"))))
136                                fields;
137                            PP.closeBox strm;
138                            PP.newline strm;
139                            str "};";
140                          PP.closeBox strm;
141                          PP.newline strm)
142                      | CL.D_StructDef(optStruct, fields, SOME tyName) => (
143                          PP.openVBox strm indent0;
144                        str "typedef struct {";                        str "typedef struct {";
145                        PP.openVBox strm indent;                        PP.openVBox strm indent;
146                          List.app (fn (ty, x) => (                          List.app (fn (ty, x) => (
# Line 120  Line 150 
150                        PP.closeBox strm;                        PP.closeBox strm;
151                        PP.newline strm;                        PP.newline strm;
152                        inHBox (fn () => (str "}"; sp(); str tyName; str ";"));                        inHBox (fn () => (str "}"; sp(); str tyName; str ";"));
153                            PP.closeBox strm;
154                        PP.newline strm)                        PP.newline strm)
155                  (* end case *))                  (* end case *))
156            and ppParam (CL.PARAM(attrs, ty, x)) = (            and ppParam (CL.PARAM(attrs, ty, x)) = (
# Line 127  Line 158 
158                  ppTy(ty, SOME(CL.varToString x)))                  ppTy(ty, SOME(CL.varToString x)))
159            and ppInit init = (case init            and ppInit init = (case init
160                   of CL.I_Exp e => ppExp e                   of CL.I_Exp e => ppExp e
161                      | CL.I_Exps fields => (
162                          str "{";
163                          PP.openHVBox strm indent;
164                            List.app (fn init => (
165                                PP.break strm;
166                                inHBox (fn () => (ppInit init; str ","))))
167                              fields;
168                          PP.closeBox strm;
169                          str "}")
170                    | CL.I_Struct fields => (                    | CL.I_Struct fields => (
171                        str "{";                        str "{";
172                        PP.openHVBox strm indent;                        PP.openHVBox strm indent;
# Line 152  Line 192 
192            and ppBlock stms =  (            and ppBlock stms =  (
193                  str "{";                  str "{";
194                  PP.openVBox strm indent;                  PP.openVBox strm indent;
195                    PP.newline strm;                    List.app (fn stm => (PP.newline strm; ppStm stm)) stms;
                   List.app ppStm stms;  
196                  PP.closeBox strm;                  PP.closeBox strm;
197                  str "}"; PP.newline strm)                  PP.newline strm;
198                    str "}")
199            and ppStm stm = (case stm            and ppStm stm = (case stm
200                   of CL.S_Block stms => ppBlock stms                   of CL.S_Block stms => ppBlock stms
201                    | CL.S_Comment l => List.app ppComLn l                    | CL.S_Comment l => List.app ppCom l
202                    | CL.S_Decl(attrs, ty, x, NONE) => (                    | CL.S_Verbatim [] => ()
203                        inHBox (fn () => (                    | CL.S_Verbatim (stm::stms) => (
204                          str stm;
205                          List.app (fn stm => (PP.newline strm; str stm)) stms)
206                      | CL.S_Decl(attrs, ty, x, NONE) => inHBox (fn () => (
207                          ppAttrs attrs;                          ppAttrs attrs;
208                          ppTy(ty, SOME x); str ";"));                        ppTy(ty, SOME x); str ";"))
209                        PP.newline strm)                    | CL.S_Decl(attrs, ty, x, SOME e) => inHBox (fn () => (
                   | CL.S_Decl(attrs,ty, x, SOME e) => (  
                       inHBox (fn () => (  
210                          ppAttrs attrs;                          ppAttrs attrs;
211                          ppTy(ty, SOME x); sp(); str "="; sp(); ppInit e; str ";"));                        ppTy(ty, SOME x); sp(); str "="; sp(); ppInit e; str ";"))
212                        PP.newline strm)                    | CL.S_Exp e => inHBox (fn () => (ppExp e; str ";"))
                   | CL.S_Exp e => (  
                       inHBox (fn () => (ppExp e; str ";"));  
                       PP.newline strm)  
213                    | CL.S_If(e, blk, CL.S_Block[]) =>                    | CL.S_If(e, blk, CL.S_Block[]) =>
214                        inHBox (fn () => (str "if"; sp(); ppExp e; ppStms blk))                        inHBox (fn () => (str "if"; sp(); ppExp e; ppStms blk))
215                    | CL.S_If(e, blk1, blk2) => (                    | CL.S_If(e, blk1, blk2) => (
216                        inHBox (fn () => (str "if"; sp(); ppExp e)); ppStms blk1;                        PP.openVBox strm indent0;
217                        str "else"; ppStms blk2)                          inHBox (fn () => (str "if"; sp(); ppExp e; ppStms blk1));
218                    | CL.S_While(e, blk) => (                          PP.newline strm;
219                        inHBox (fn () => (str "while"; sp(); ppExp e)); ppStms blk)                          inHBox (fn () => (str "else"; ppStms blk2));
220                    | CL.S_DoWhile(blk, e) => (                        PP.closeBox strm)
221                        str "do"; sp(); ppStms blk;                    | CL.S_While(e, blk) =>
222                        inHBox (fn () => (str "while"; sp(); ppExp e; str ";")))                        inHBox (fn () => (str "while"; sp(); ppExp e; ppStms blk))
223                      | CL.S_DoWhile(blk, e) =>
224                          inHBox (fn () => (
225                            str "do"; ppStms blk; sp(); str "while"; sp(); ppExp e))
226                    | CL.S_For(inits, cond, incrs, blk) => let                    | CL.S_For(inits, cond, incrs, blk) => let
227                        fun ppInit (ty, x, e) = inHBox (fn () => (                        fun ppInit (ty, x, e) = inHBox (fn () => (
228                              ppTy(ty, SOME x);                              ppTy(ty, SOME x);
# Line 193  Line 234 
234                            ppList {pp = ppInit, sep = fn () => str ",", l = inits};                            ppList {pp = ppInit, sep = fn () => str ",", l = inits};
235                            str ";"; sp();                            str ";"; sp();
236                            ppExp cond; str ";"; sp();                            ppExp cond; str ";"; sp();
237                            ppList {pp = ppExp, sep = fn () => str ",", l = incrs}));                            ppList {pp = ppExp, sep = fn () => str ",", l = incrs};
238                            str ")";                            str ")";
239                          ppStms blk                            ppStms blk))
240                        end                        end
241                    | CL.S_Call(f, args) => (                    | CL.S_Return(SOME e) => inHBox (fn () => (str "return"; sp(); ppExp e; str ";"))
242                        inHBox (fn () => (str f; ppArgs args; str ";"));                    | CL.S_Return _ => str "return;"
243                        PP.newline strm)                    | CL.S_Break => str "break;"
244                    | CL.S_Return(SOME e) => (                    | CL.S_Continue => str "continue;"
                       inHBox (fn () => (str "return"; sp(); ppExp e; str ";"));  
                       PP.newline strm)  
                   | CL.S_Return _ => (str "return;"; PP.newline strm)  
                   | CL.S_Break => (str "break;"; PP.newline strm)  
                   | CL.S_Continue => (str "continue;"; PP.newline strm)  
245                  (* end case *))                  (* end case *))
246            and ppStms (CL.S_Block stms) = (sp(); ppBlock stms)            and ppStms (CL.S_Block stms) = (sp(); ppBlock stms)
247              | ppStms stm = (              | ppStms stm = (
248                  PP.openVBox strm indent;                  PP.openHOVBox strm indent;
249                    PP.newline strm;                    sp ();
250                    ppStm stm;                    ppStm stm;
251                  PP.closeBox strm)                  PP.closeBox strm)
252            and ppExp e = (case e            and ppExp e = (case e
# Line 222  Line 258 
258                    | CL.E_BinOp(e1, rator, e2) => (ppExp e1; str(CL.binopToString rator); ppExp e2)                    | CL.E_BinOp(e1, rator, e2) => (ppExp e1; str(CL.binopToString rator); ppExp e2)
259                    | CL.E_UnOp(rator, e) => (str(CL.unopToString rator); ppExp e)                    | CL.E_UnOp(rator, e) => (str(CL.unopToString rator); ppExp e)
260                    | CL.E_PostOp(e, rator) => (ppExp e; str(CL.postopToString rator))                    | CL.E_PostOp(e, rator) => (ppExp e; str(CL.postopToString rator))
261                    | CL.E_Apply(f, args) => (str f; ppArgs args)                    | CL.E_Apply(e, args) => (ppExp e; ppArgs args)
262                    | CL.E_Subscript(e1, e2) => (ppExp e1; str "["; ppExp e2; str "]")                    | CL.E_Subscript(e1, e2) => (ppExp e1; str "["; ppExp e2; str "]")
263                    | CL.E_Select(e, f) => (ppExp e; str "."; str f)                    | CL.E_Select(e, f) => (ppExp e; str "."; str f)
264                    | CL.E_Indirect(e, f) => (ppExp e; str "->"; str f)                    | CL.E_Indirect(e, f) => (ppExp e; str "->"; str f)
# Line 252  Line 288 
288                        end                        end
289                    | CL.E_Bool b => str(Bool.toString b)                    | CL.E_Bool b => str(Bool.toString b)
290                    | CL.E_Str s => str(concat["\"", String.toCString s, "\""])                    | CL.E_Str s => str(concat["\"", String.toCString s, "\""])
291                      | CL.E_Char c => str(concat["'", Char.toCString c, "'"])
292                    | CL.E_Sizeof ty => (str "sizeof("; ppTy(ty, NONE); str ")")                    | CL.E_Sizeof ty => (str "sizeof("; ppTy(ty, NONE); str ")")
293                  (* end case *))                  (* end case *))
294            and ppArgs args = (            and ppArgs args = (

Legend:
Removed from v.1640  
changed lines
  Added in v.2746

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