e192694e9d00224ff10be2e8408862895f3714dd
[bpt/coccinelle.git] / parsing_cocci / visitor_ast0.ml
1 (*
2 * Copyright 2012, INRIA
3 * Julia Lawall, Gilles Muller
4 * Copyright 2010-2011, INRIA, University of Copenhagen
5 * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
6 * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
7 * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
8 * This file is part of Coccinelle.
9 *
10 * Coccinelle is free software: you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation, according to version 2 of the License.
13 *
14 * Coccinelle is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with Coccinelle. If not, see <http://www.gnu.org/licenses/>.
21 *
22 * The authors reserve the right to distribute this or future versions of
23 * Coccinelle under other licenses.
24 *)
25
26
27 # 0 "./visitor_ast0.ml"
28 (* --------------------------------------------------------------------- *)
29 (* Generic traversal: rebuilder *)
30
31 module Ast = Ast_cocci
32 module Ast0 = Ast0_cocci
33 module VT0 = Visitor_ast0_types
34
35 type mode = COMBINER | REBUILDER | BOTH
36
37 let map_split f l = List.split(List.map f l)
38
39 let rewrap x (n,e) = (n,Ast0.rewrap x e)
40
41 let visitor mode bind option_default
42 meta_mcode string_mcode const_mcode assign_mcode fix_mcode unary_mcode
43 binary_mcode cv_mcode sign_mcode struct_mcode storage_mcode
44 inc_mcode
45 dotsexprfn dotsinitfn dotsparamfn dotsstmtfn dotsdeclfn dotscasefn
46 identfn exprfn tyfn initfn paramfn declfn stmtfn casefn topfn =
47 let multibind l =
48 let rec loop = function
49 [] -> option_default
50 | [x] -> x
51 | x::xs -> bind x (loop xs) in
52 loop l in
53 let map_split_bind f l =
54 let (n,e) = List.split(List.map f l) in (multibind n,e) in
55 let get_option f = function
56 Some x -> let (n,e) = f x in (n,Some e)
57 | None -> (option_default,None) in
58 let do_disj starter lst mids ender processor rebuilder =
59 let (starter_n,starter) = string_mcode starter in
60 let (lst_n,lst) = map_split processor lst in
61 let (mids_n,mids) = map_split string_mcode mids in
62 let (ender_n,ender) = string_mcode ender in
63 (multibind
64 [starter_n;List.hd lst_n;
65 multibind (List.map2 bind mids_n (List.tl lst_n));ender_n],
66 rebuilder starter lst mids ender) in
67 let rec expression_dots d =
68 let k d =
69 rewrap d
70 (match Ast0.unwrap d with
71 Ast0.DOTS(l) ->
72 let (n,l) = map_split_bind expression l in (n,Ast0.DOTS(l))
73 | Ast0.CIRCLES(l) ->
74 let (n,l) = map_split_bind expression l in (n,Ast0.CIRCLES(l))
75 | Ast0.STARS(l) ->
76 let (n,l) = map_split_bind expression l in (n,Ast0.STARS(l))) in
77 dotsexprfn all_functions k d
78 and initialiser_list i =
79 let k i =
80 rewrap i
81 (match Ast0.unwrap i with
82 Ast0.DOTS(l) ->
83 let (n,l) = map_split_bind initialiser l in (n,Ast0.DOTS(l))
84 | Ast0.CIRCLES(l) ->
85 let (n,l) = map_split_bind initialiser l in (n,Ast0.CIRCLES(l))
86 | Ast0.STARS(l) ->
87 let (n,l) = map_split_bind initialiser l in (n,Ast0.STARS(l))) in
88 dotsinitfn all_functions k i
89
90 and parameter_list d =
91 let k d =
92 rewrap d
93 (match Ast0.unwrap d with
94 Ast0.DOTS(l) ->
95 let (n,l) = map_split_bind parameterTypeDef l in
96 (n,Ast0.DOTS(l))
97 | Ast0.CIRCLES(l) ->
98 let (n,l) = map_split_bind parameterTypeDef l in
99 (n,Ast0.CIRCLES(l))
100 | Ast0.STARS(l) ->
101 let (n,l) = map_split_bind parameterTypeDef l in
102 (n,Ast0.STARS(l))) in
103 dotsparamfn all_functions k d
104
105 and statement_dots d =
106 let k d =
107 rewrap d
108 (match Ast0.unwrap d with
109 Ast0.DOTS(l) ->
110 let (n,l) = map_split_bind statement l in (n,Ast0.DOTS(l))
111 | Ast0.CIRCLES(l) ->
112 let (n,l) = map_split_bind statement l in (n,Ast0.CIRCLES(l))
113 | Ast0.STARS(l) ->
114 let (n,l) = map_split_bind statement l in (n,Ast0.STARS(l))) in
115 dotsstmtfn all_functions k d
116
117 and declaration_dots d =
118 let k d =
119 rewrap d
120 (match Ast0.unwrap d with
121 Ast0.DOTS(l) ->
122 let (n,l) = map_split_bind declaration l in (n, Ast0.DOTS(l))
123 | Ast0.CIRCLES(l) ->
124 let (n,l) = map_split_bind declaration l in (n, Ast0.CIRCLES(l))
125 | Ast0.STARS(l) ->
126 let (n,l) = map_split_bind declaration l in (n, Ast0.STARS(l))) in
127 dotsdeclfn all_functions k d
128
129 and case_line_dots d =
130 let k d =
131 rewrap d
132 (match Ast0.unwrap d with
133 Ast0.DOTS(l) ->
134 let (n,l) = map_split_bind case_line l in (n, Ast0.DOTS(l))
135 | Ast0.CIRCLES(l) ->
136 let (n,l) = map_split_bind case_line l in (n, Ast0.CIRCLES(l))
137 | Ast0.STARS(l) ->
138 let (n,l) = map_split_bind case_line l in (n, Ast0.STARS(l))) in
139 dotscasefn all_functions k d
140
141 and ident i =
142 let k i =
143 rewrap i
144 (match Ast0.unwrap i with
145 Ast0.Id(name) ->
146 let (n,name) = string_mcode name in (n,Ast0.Id(name))
147 | Ast0.MetaId(name,constraints,seed,pure) ->
148 let (n,name) = meta_mcode name in
149 (n,Ast0.MetaId(name,constraints,seed,pure))
150 | Ast0.MetaFunc(name,constraints,pure) ->
151 let (n,name) = meta_mcode name in
152 (n,Ast0.MetaFunc(name,constraints,pure))
153 | Ast0.MetaLocalFunc(name,constraints,pure) ->
154 let (n,name) = meta_mcode name in
155 (n,Ast0.MetaLocalFunc(name,constraints,pure))
156 | Ast0.DisjId(starter,id_list,mids,ender) ->
157 do_disj starter id_list mids ender ident
158 (fun starter id_list mids ender ->
159 Ast0.DisjId(starter,id_list,mids,ender))
160 | Ast0.OptIdent(id) ->
161 let (n,id) = ident id in (n,Ast0.OptIdent(id))
162 | Ast0.UniqueIdent(id) ->
163 let (n,id) = ident id in (n,Ast0.UniqueIdent(id))) in
164 identfn all_functions k i
165
166 and expression e =
167 let k e =
168 rewrap e
169 (match Ast0.unwrap e with
170 Ast0.Ident(id) ->
171 let (n,id) = ident id in (n,Ast0.Ident(id))
172 | Ast0.Constant(const) ->
173 let (n,const) = const_mcode const in (n,Ast0.Constant(const))
174 | Ast0.FunCall(fn,lp,args,rp) ->
175 let (fn_n,fn) = expression fn in
176 let (lp_n,lp) = string_mcode lp in
177 let (args_n,args) = expression_dots args in
178 let (rp_n,rp) = string_mcode rp in
179 (multibind [fn_n;lp_n;args_n;rp_n], Ast0.FunCall(fn,lp,args,rp))
180 | Ast0.Assignment(left,op,right,simple) ->
181 let (left_n,left) = expression left in
182 let (op_n,op) = assign_mcode op in
183 let (right_n,right) = expression right in
184 (multibind [left_n;op_n;right_n],
185 Ast0.Assignment(left,op,right,simple))
186 | Ast0.Sequence(left,op,right) ->
187 let (left_n,left) = expression left in
188 let (op_n,op) = string_mcode op in
189 let (right_n,right) = expression right in
190 (multibind [left_n;op_n;right_n],
191 Ast0.Sequence(left,op,right))
192 | Ast0.CondExpr(exp1,why,exp2,colon,exp3) ->
193 let (exp1_n,exp1) = expression exp1 in
194 let (why_n,why) = string_mcode why in
195 let (exp2_n,exp2) = get_option expression exp2 in
196 let (colon_n,colon) = string_mcode colon in
197 let (exp3_n,exp3) = expression exp3 in
198 (multibind [exp1_n;why_n;exp2_n;colon_n;exp3_n],
199 Ast0.CondExpr(exp1,why,exp2,colon,exp3))
200 | Ast0.Postfix(exp,op) ->
201 let (exp_n,exp) = expression exp in
202 let (op_n,op) = fix_mcode op in
203 (bind exp_n op_n, Ast0.Postfix(exp,op))
204 | Ast0.Infix(exp,op) ->
205 let (exp_n,exp) = expression exp in
206 let (op_n,op) = fix_mcode op in
207 (bind op_n exp_n, Ast0.Infix(exp,op))
208 | Ast0.Unary(exp,op) ->
209 let (exp_n,exp) = expression exp in
210 let (op_n,op) = unary_mcode op in
211 (bind op_n exp_n, Ast0.Unary(exp,op))
212 | Ast0.Binary(left,op,right) ->
213 let (left_n,left) = expression left in
214 let (op_n,op) = binary_mcode op in
215 let (right_n,right) = expression right in
216 (multibind [left_n;op_n;right_n], Ast0.Binary(left,op,right))
217 | Ast0.Nested(left,op,right) ->
218 let (left_n,left) = expression left in
219 let (op_n,op) = binary_mcode op in
220 let (right_n,right) = expression right in
221 (multibind [left_n;op_n;right_n], Ast0.Nested(left,op,right))
222 | Ast0.Paren(lp,exp,rp) ->
223 let (lp_n,lp) = string_mcode lp in
224 let (exp_n,exp) = expression exp in
225 let (rp_n,rp) = string_mcode rp in
226 (multibind [lp_n;exp_n;rp_n], Ast0.Paren(lp,exp,rp))
227 | Ast0.ArrayAccess(exp1,lb,exp2,rb) ->
228 let (exp1_n,exp1) = expression exp1 in
229 let (lb_n,lb) = string_mcode lb in
230 let (exp2_n,exp2) = expression exp2 in
231 let (rb_n,rb) = string_mcode rb in
232 (multibind [exp1_n;lb_n;exp2_n;rb_n],
233 Ast0.ArrayAccess(exp1,lb,exp2,rb))
234 | Ast0.RecordAccess(exp,pt,field) ->
235 let (exp_n,exp) = expression exp in
236 let (pt_n,pt) = string_mcode pt in
237 let (field_n,field) = ident field in
238 (multibind [exp_n;pt_n;field_n], Ast0.RecordAccess(exp,pt,field))
239 | Ast0.RecordPtAccess(exp,ar,field) ->
240 let (exp_n,exp) = expression exp in
241 let (ar_n,ar) = string_mcode ar in
242 let (field_n,field) = ident field in
243 (multibind [exp_n;ar_n;field_n], Ast0.RecordPtAccess(exp,ar,field))
244 | Ast0.Cast(lp,ty,rp,exp) ->
245 let (lp_n,lp) = string_mcode lp in
246 let (ty_n,ty) = typeC ty in
247 let (rp_n,rp) = string_mcode rp in
248 let (exp_n,exp) = expression exp in
249 (multibind [lp_n;ty_n;rp_n;exp_n], Ast0.Cast(lp,ty,rp,exp))
250 | Ast0.SizeOfExpr(szf,exp) ->
251 let (szf_n,szf) = string_mcode szf in
252 let (exp_n,exp) = expression exp in
253 (multibind [szf_n;exp_n],Ast0.SizeOfExpr(szf,exp))
254 | Ast0.SizeOfType(szf,lp,ty,rp) ->
255 let (szf_n,szf) = string_mcode szf in
256 let (lp_n,lp) = string_mcode lp in
257 let (ty_n,ty) = typeC ty in
258 let (rp_n,rp) = string_mcode rp in
259 (multibind [szf_n;lp_n;ty_n;rp_n], Ast0.SizeOfType(szf,lp,ty,rp))
260 | Ast0.TypeExp(ty) ->
261 let (ty_n,ty) = typeC ty in
262 (ty_n,Ast0.TypeExp(ty))
263 | Ast0.Constructor(lp,ty,rp,init) ->
264 let (lp_n,lp) = string_mcode lp in
265 let (ty_n,ty) = typeC ty in
266 let (rp_n,rp) = string_mcode rp in
267 let (init_n,init) = initialiser init in
268 (multibind [lp_n;ty_n;rp_n;init_n], Ast0.Constructor(lp,ty,rp,init))
269 | Ast0.MetaErr(name,constraints,pure) ->
270 let (name_n,name) = meta_mcode name in
271 (name_n,Ast0.MetaErr(name,constraints,pure))
272 | Ast0.MetaExpr(name,constraints,ty,form,pure) ->
273 let (name_n,name) = meta_mcode name in
274 (name_n,Ast0.MetaExpr(name,constraints,ty,form,pure))
275 | Ast0.MetaExprList(name,lenname,pure) ->
276 let (name_n,name) = meta_mcode name in
277 (name_n,Ast0.MetaExprList(name,lenname,pure))
278 | Ast0.EComma(cm) ->
279 let (cm_n,cm) = string_mcode cm in (cm_n,Ast0.EComma(cm))
280 | Ast0.DisjExpr(starter,expr_list,mids,ender) ->
281 do_disj starter expr_list mids ender expression
282 (fun starter expr_list mids ender ->
283 Ast0.DisjExpr(starter,expr_list,mids,ender))
284 | Ast0.NestExpr(starter,expr_dots,ender,whencode,multi) ->
285 let (starter_n,starter) = string_mcode starter in
286 let (expr_dots_n,expr_dots) = expression_dots expr_dots in
287 let (ender_n,ender) = string_mcode ender in
288 let (whencode_n,whencode) = get_option expression whencode in
289 (multibind [starter_n;expr_dots_n;ender_n;whencode_n],
290 Ast0.NestExpr(starter,expr_dots,ender,whencode,multi))
291 | Ast0.Edots(dots,whencode) ->
292 let (dots_n,dots) = string_mcode dots in
293 let (whencode_n,whencode) = get_option expression whencode in
294 (bind dots_n whencode_n,Ast0.Edots(dots,whencode))
295 | Ast0.Ecircles(dots,whencode) ->
296 let (dots_n,dots) = string_mcode dots in
297 let (whencode_n,whencode) = get_option expression whencode in
298 (bind dots_n whencode_n,Ast0.Ecircles(dots,whencode))
299 | Ast0.Estars(dots,whencode) ->
300 let (dots_n,dots) = string_mcode dots in
301 let (whencode_n,whencode) = get_option expression whencode in
302 (bind dots_n whencode_n,Ast0.Estars(dots,whencode))
303 | Ast0.OptExp(exp) ->
304 let (exp_n,exp) = expression exp in
305 (exp_n,Ast0.OptExp(exp))
306 | Ast0.UniqueExp(exp) ->
307 let (exp_n,exp) = expression exp in
308 (exp_n,Ast0.UniqueExp(exp))
309 | Ast0.AsExpr(exp,asexp) ->
310 let (exp_n,exp) = expression exp in
311 let (asexp_n,asexp) = expression asexp in
312 (bind exp_n asexp_n, Ast0.AsExpr(exp,asexp))) in
313 exprfn all_functions k e
314 and typeC t =
315 let k t =
316 rewrap t
317 (match Ast0.unwrap t with
318 Ast0.ConstVol(cv,ty) ->
319 let (cv_n,cv) = cv_mcode cv in
320 let (ty_n,ty) = typeC ty in
321 (bind cv_n ty_n, Ast0.ConstVol(cv,ty))
322 | Ast0.BaseType(ty,strings) ->
323 let (strings_n,strings) = map_split_bind string_mcode strings in
324 (strings_n, Ast0.BaseType(ty,strings))
325 | Ast0.Signed(sign,ty) ->
326 let (sign_n,sign) = sign_mcode sign in
327 let (ty_n,ty) = get_option typeC ty in
328 (bind sign_n ty_n, Ast0.Signed(sign,ty))
329 | Ast0.Pointer(ty,star) ->
330 let (ty_n,ty) = typeC ty in
331 let (star_n,star) = string_mcode star in
332 (bind ty_n star_n, Ast0.Pointer(ty,star))
333 | Ast0.FunctionPointer(ty,lp1,star,rp1,lp2,params,rp2) ->
334 function_pointer (ty,lp1,star,rp1,lp2,params,rp2) []
335 | Ast0.FunctionType(ty,lp1,params,rp1) ->
336 function_type (ty,lp1,params,rp1) []
337 | Ast0.Array(ty,lb,size,rb) -> array_type (ty,lb,size,rb) []
338 | Ast0.EnumName(kind,name) ->
339 let (kind_n,kind) = string_mcode kind in
340 let (name_n,name) = get_option ident name in
341 (bind kind_n name_n, Ast0.EnumName(kind,name))
342 | Ast0.EnumDef(ty,lb,ids,rb) ->
343 let (ty_n,ty) = typeC ty in
344 let (lb_n,lb) = string_mcode lb in
345 let (ids_n,ids) = expression_dots ids in
346 let (rb_n,rb) = string_mcode rb in
347 (multibind [ty_n;lb_n;ids_n;rb_n], Ast0.EnumDef(ty,lb,ids,rb))
348 | Ast0.StructUnionName(kind,name) ->
349 let (kind_n,kind) = struct_mcode kind in
350 let (name_n,name) = get_option ident name in
351 (bind kind_n name_n, Ast0.StructUnionName(kind,name))
352 | Ast0.StructUnionDef(ty,lb,decls,rb) ->
353 let (ty_n,ty) = typeC ty in
354 let (lb_n,lb) = string_mcode lb in
355 let (decls_n,decls) = declaration_dots decls in
356 let (rb_n,rb) = string_mcode rb in
357 (multibind [ty_n;lb_n;decls_n;rb_n],
358 Ast0.StructUnionDef(ty,lb,decls,rb))
359 | Ast0.TypeName(name) ->
360 let (name_n,name) = string_mcode name in
361 (name_n,Ast0.TypeName(name))
362 | Ast0.MetaType(name,pure) ->
363 let (name_n,name) = meta_mcode name in
364 (name_n,Ast0.MetaType(name,pure))
365 | Ast0.DisjType(starter,types,mids,ender) ->
366 do_disj starter types mids ender typeC
367 (fun starter types mids ender ->
368 Ast0.DisjType(starter,types,mids,ender))
369 | Ast0.OptType(ty) ->
370 let (ty_n,ty) = typeC ty in (ty_n, Ast0.OptType(ty))
371 | Ast0.UniqueType(ty) ->
372 let (ty_n,ty) = typeC ty in (ty_n, Ast0.UniqueType(ty))
373 | Ast0.AsType(ty,asty) ->
374 let (ty_n,ty) = typeC ty in
375 let (asty_n,asty) = typeC asty in
376 (bind ty_n asty_n, Ast0.AsType(ty,asty))) in
377 tyfn all_functions k t
378
379 and function_pointer (ty,lp1,star,rp1,lp2,params,rp2) extra =
380 let (ty_n,ty) = typeC ty in
381 let (lp1_n,lp1) = string_mcode lp1 in
382 let (star_n,star) = string_mcode star in
383 let (rp1_n,rp1) = string_mcode rp1 in
384 let (lp2_n,lp2) = string_mcode lp2 in
385 let (params_n,params) = parameter_list params in
386 let (rp2_n,rp2) = string_mcode rp2 in
387 (* have to put the treatment of the identifier into the right position *)
388 (multibind ([ty_n;lp1_n;star_n] @ extra @ [rp1_n;lp2_n;params_n;rp2_n]),
389 Ast0.FunctionPointer(ty,lp1,star,rp1,lp2,params,rp2))
390 and function_type (ty,lp1,params,rp1) extra =
391 let (ty_n,ty) = get_option typeC ty in
392 let (lp1_n,lp1) = string_mcode lp1 in
393 let (params_n,params) = parameter_list params in
394 let (rp1_n,rp1) = string_mcode rp1 in
395 (* have to put the treatment of the identifier into the right position *)
396 (multibind (ty_n :: extra @ [lp1_n;params_n;rp1_n]),
397 Ast0.FunctionType(ty,lp1,params,rp1))
398 and array_type (ty,lb,size,rb) extra =
399 let (ty_n,ty) = typeC ty in
400 let (lb_n,lb) = string_mcode lb in
401 let (size_n,size) = get_option expression size in
402 let (rb_n,rb) = string_mcode rb in
403 (multibind (ty_n :: extra @ [lb_n;size_n;rb_n]),
404 Ast0.Array(ty,lb,size,rb))
405
406 and named_type ty id =
407 let (id_n,id) = ident id in
408 match Ast0.unwrap ty with
409 Ast0.FunctionPointer(rty,lp1,star,rp1,lp2,params,rp2) ->
410 let tyres =
411 function_pointer (rty,lp1,star,rp1,lp2,params,rp2) [id_n] in
412 (rewrap ty tyres, id)
413 | Ast0.FunctionType(rty,lp1,params,rp1) ->
414 let tyres = function_type (rty,lp1,params,rp1) [id_n] in
415 (rewrap ty tyres, id)
416 | Ast0.Array(rty,lb,size,rb) ->
417 let tyres = array_type (rty,lb,size,rb) [id_n] in
418 (rewrap ty tyres, id)
419 | _ -> let (ty_n,ty) = typeC ty in ((bind ty_n id_n, ty), id)
420
421 and declaration d =
422 let k d =
423 rewrap d
424 (match Ast0.unwrap d with
425 Ast0.MetaDecl(name,pure) ->
426 let (n,name) = meta_mcode name in
427 (n,Ast0.MetaDecl(name,pure))
428 | Ast0.MetaField(name,pure) ->
429 let (n,name) = meta_mcode name in
430 (n,Ast0.MetaField(name,pure))
431 | Ast0.MetaFieldList(name,lenname,pure) ->
432 let (n,name) = meta_mcode name in
433 (n,Ast0.MetaFieldList(name,lenname,pure))
434 | Ast0.Init(stg,ty,id,eq,ini,sem) ->
435 let (stg_n,stg) = get_option storage_mcode stg in
436 let ((ty_id_n,ty),id) = named_type ty id in
437 let (eq_n,eq) = string_mcode eq in
438 let (ini_n,ini) = initialiser ini in
439 let (sem_n,sem) = string_mcode sem in
440 (multibind [stg_n;ty_id_n;eq_n;ini_n;sem_n],
441 Ast0.Init(stg,ty,id,eq,ini,sem))
442 | Ast0.UnInit(stg,ty,id,sem) ->
443 let (stg_n,stg) = get_option storage_mcode stg in
444 let ((ty_id_n,ty),id) = named_type ty id in
445 let (sem_n,sem) = string_mcode sem in
446 (multibind [stg_n;ty_id_n;sem_n], Ast0.UnInit(stg,ty,id,sem))
447 | Ast0.MacroDecl(name,lp,args,rp,sem) ->
448 let (name_n,name) = ident name in
449 let (lp_n,lp) = string_mcode lp in
450 let (args_n,args) = expression_dots args in
451 let (rp_n,rp) = string_mcode rp in
452 let (sem_n,sem) = string_mcode sem in
453 (multibind [name_n;lp_n;args_n;rp_n;sem_n],
454 Ast0.MacroDecl(name,lp,args,rp,sem))
455 | Ast0.MacroDeclInit(name,lp,args,rp,eq,ini,sem) ->
456 let (name_n,name) = ident name in
457 let (lp_n,lp) = string_mcode lp in
458 let (args_n,args) = expression_dots args in
459 let (rp_n,rp) = string_mcode rp in
460 let (eq_n,eq) = string_mcode eq in
461 let (ini_n,ini) = initialiser ini in
462 let (sem_n,sem) = string_mcode sem in
463 (multibind [name_n;lp_n;args_n;rp_n;eq_n;ini_n;sem_n],
464 Ast0.MacroDeclInit(name,lp,args,rp,eq,ini,sem))
465 | Ast0.TyDecl(ty,sem) ->
466 let (ty_n,ty) = typeC ty in
467 let (sem_n,sem) = string_mcode sem in
468 (bind ty_n sem_n, Ast0.TyDecl(ty,sem))
469 | Ast0.Typedef(stg,ty,id,sem) ->
470 let (stg_n,stg) = string_mcode stg in
471 let (ty_n,ty) = typeC ty in
472 let (id_n,id) = typeC id in
473 let (sem_n,sem) = string_mcode sem in
474 (multibind [stg_n;ty_n;id_n;sem_n], Ast0.Typedef(stg,ty,id,sem))
475 | Ast0.DisjDecl(starter,decls,mids,ender) ->
476 do_disj starter decls mids ender declaration
477 (fun starter decls mids ender ->
478 Ast0.DisjDecl(starter,decls,mids,ender))
479 | Ast0.Ddots(dots,whencode) ->
480 let (dots_n,dots) = string_mcode dots in
481 let (whencode_n,whencode) = get_option declaration whencode in
482 (bind dots_n whencode_n, Ast0.Ddots(dots,whencode))
483 | Ast0.OptDecl(decl) ->
484 let (n,decl) = declaration decl in (n,Ast0.OptDecl(decl))
485 | Ast0.UniqueDecl(decl) ->
486 let (n,decl) = declaration decl in (n,Ast0.UniqueDecl(decl))
487 | Ast0.AsDecl(decl,asdecl) ->
488 let (decl_n,decl) = declaration decl in
489 let (asdecl_n,asdecl) = declaration asdecl in
490 (bind decl_n asdecl_n, Ast0.AsDecl(decl,asdecl))) in
491 declfn all_functions k d
492
493 and initialiser i =
494 let k i =
495 rewrap i
496 (match Ast0.unwrap i with
497 Ast0.MetaInit(name,pure) ->
498 let (name_n,name) = meta_mcode name in
499 (name_n,Ast0.MetaInit(name,pure))
500 | Ast0.MetaInitList(name,lenname,pure) ->
501 let (name_n,name) = meta_mcode name in
502 (name_n,Ast0.MetaInitList(name,lenname,pure))
503 | Ast0.InitExpr(exp) ->
504 let (exp_n,exp) = expression exp in
505 (exp_n,Ast0.InitExpr(exp))
506 | Ast0.InitList(lb,initlist,rb,ordered) ->
507 let (lb_n,lb) = string_mcode lb in
508 let (initlist_n,initlist) = initialiser_list initlist in
509 let (rb_n,rb) = string_mcode rb in
510 (multibind [lb_n;initlist_n;rb_n],
511 Ast0.InitList(lb,initlist,rb,ordered))
512 | Ast0.InitGccExt(designators,eq,ini) ->
513 let (dn,designators) = map_split_bind designator designators in
514 let (eq_n,eq) = string_mcode eq in
515 let (ini_n,ini) = initialiser ini in
516 (multibind [dn;eq_n;ini_n], Ast0.InitGccExt(designators,eq,ini))
517 | Ast0.InitGccName(name,eq,ini) ->
518 let (name_n,name) = ident name in
519 let (eq_n,eq) = string_mcode eq in
520 let (ini_n,ini) = initialiser ini in
521 (multibind [name_n;eq_n;ini_n], Ast0.InitGccName(name,eq,ini))
522 | Ast0.IComma(cm) ->
523 let (n,cm) = string_mcode cm in (n,Ast0.IComma(cm))
524 | Ast0.Idots(d,whencode) ->
525 let (d_n,d) = string_mcode d in
526 let (whencode_n,whencode) = get_option initialiser whencode in
527 (bind d_n whencode_n, Ast0.Idots(d,whencode))
528 | Ast0.OptIni(i) ->
529 let (n,i) = initialiser i in (n,Ast0.OptIni(i))
530 | Ast0.UniqueIni(i) ->
531 let (n,i) = initialiser i in (n,Ast0.UniqueIni(i))
532 | Ast0.AsInit(ini,asini) ->
533 let (ini_n,ini) = initialiser ini in
534 let (asini_n,asini) = initialiser asini in
535 (bind ini_n asini_n, Ast0.AsInit(ini,asini))) in
536 initfn all_functions k i
537
538 and designator = function
539 Ast0.DesignatorField(dot,id) ->
540 let (dot_n,dot) = string_mcode dot in
541 let (id_n,id) = ident id in
542 (bind dot_n id_n, Ast0.DesignatorField(dot,id))
543 | Ast0.DesignatorIndex(lb,exp,rb) ->
544 let (lb_n,lb) = string_mcode lb in
545 let (exp_n,exp) = expression exp in
546 let (rb_n,rb) = string_mcode rb in
547 (multibind [lb_n;exp_n;rb_n], Ast0.DesignatorIndex(lb,exp,rb))
548 | Ast0.DesignatorRange(lb,min,dots,max,rb) ->
549 let (lb_n,lb) = string_mcode lb in
550 let (min_n,min) = expression min in
551 let (dots_n,dots) = string_mcode dots in
552 let (max_n,max) = expression max in
553 let (rb_n,rb) = string_mcode rb in
554 (multibind [lb_n;min_n;dots_n;max_n;rb_n],
555 Ast0.DesignatorRange(lb,min,dots,max,rb))
556
557 and parameterTypeDef p =
558 let k p =
559 rewrap p
560 (match Ast0.unwrap p with
561 Ast0.VoidParam(ty) ->
562 let (n,ty) = typeC ty in (n,Ast0.VoidParam(ty))
563 | Ast0.Param(ty,Some id) ->
564 let ((ty_id_n,ty),id) = named_type ty id in
565 (ty_id_n, Ast0.Param(ty,Some id))
566 | Ast0.Param(ty,None) ->
567 let (ty_n,ty) = typeC ty in
568 (ty_n, Ast0.Param(ty,None))
569 | Ast0.MetaParam(name,pure) ->
570 let (n,name) = meta_mcode name in
571 (n,Ast0.MetaParam(name,pure))
572 | Ast0.MetaParamList(name,lenname,pure) ->
573 let (n,name) = meta_mcode name in
574 (n,Ast0.MetaParamList(name,lenname,pure))
575 | Ast0.PComma(cm) ->
576 let (n,cm) = string_mcode cm in (n,Ast0.PComma(cm))
577 | Ast0.Pdots(dots) ->
578 let (n,dots) = string_mcode dots in (n,Ast0.Pdots(dots))
579 | Ast0.Pcircles(dots) ->
580 let (n,dots) = string_mcode dots in (n,Ast0.Pcircles(dots))
581 | Ast0.OptParam(param) ->
582 let (n,param) = parameterTypeDef param in (n,Ast0.OptParam(param))
583 | Ast0.UniqueParam(param) ->
584 let (n,param) = parameterTypeDef param in
585 (n,Ast0.UniqueParam(param))) in
586 paramfn all_functions k p
587
588 (* not done for combiner, because the statement is assumed to be already
589 represented elsewhere in the code *)
590 (* NOTE: This is not called for combiner_rebuilder. This is ok for its
591 only current use. *)
592 and process_bef_aft s =
593 Ast0.set_dots_bef_aft s
594 (match Ast0.get_dots_bef_aft s with
595 Ast0.NoDots -> Ast0.NoDots
596 | Ast0.DroppingBetweenDots(stm) ->
597 let (_,stm) = statement stm in Ast0.DroppingBetweenDots(stm)
598 | Ast0.AddingBetweenDots(stm) ->
599 let (_,stm) = statement stm in Ast0.AddingBetweenDots(stm))
600
601 and statement s =
602 (if mode = COMBINER then let _ = process_bef_aft s in ());
603 let k s =
604 rewrap s
605 (match Ast0.unwrap s with
606 Ast0.FunDecl(bef,fi,name,lp,params,rp,lbrace,body,rbrace) ->
607 let (fi_n,fi) = map_split_bind fninfo fi in
608 let (name_n,name) = ident name in
609 let (lp_n,lp) = string_mcode lp in
610 let (params_n,params) = parameter_list params in
611 let (rp_n,rp) = string_mcode rp in
612 let (lbrace_n,lbrace) = string_mcode lbrace in
613 let (body_n,body) = statement_dots body in
614 let (rbrace_n,rbrace) = string_mcode rbrace in
615 (multibind
616 [fi_n;name_n;lp_n;params_n;rp_n;lbrace_n;body_n;rbrace_n],
617 Ast0.FunDecl(bef,fi,name,lp,params,rp,lbrace,body,rbrace))
618 | Ast0.Decl(bef,decl) ->
619 let (decl_n,decl) = declaration decl in
620 (decl_n,Ast0.Decl(bef,decl))
621 | Ast0.Seq(lbrace,body,rbrace) ->
622 let (lbrace_n,lbrace) = string_mcode lbrace in
623 let (body_n,body) = statement_dots body in
624 let (rbrace_n,rbrace) = string_mcode rbrace in
625 (multibind [lbrace_n;body_n;rbrace_n],
626 Ast0.Seq(lbrace,body,rbrace))
627 | Ast0.ExprStatement(exp,sem) ->
628 let (exp_n,exp) = get_option expression exp in
629 let (sem_n,sem) = string_mcode sem in
630 (bind exp_n sem_n, Ast0.ExprStatement(exp,sem))
631 | Ast0.IfThen(iff,lp,exp,rp,branch1,aft) ->
632 let (iff_n,iff) = string_mcode iff in
633 let (lp_n,lp) = string_mcode lp in
634 let (exp_n,exp) = expression exp in
635 let (rp_n,rp) = string_mcode rp in
636 let (branch1_n,branch1) = statement branch1 in
637 (multibind [iff_n;lp_n;exp_n;rp_n;branch1_n],
638 Ast0.IfThen(iff,lp,exp,rp,branch1,aft))
639 | Ast0.IfThenElse(iff,lp,exp,rp,branch1,els,branch2,aft) ->
640 let (iff_n,iff) = string_mcode iff in
641 let (lp_n,lp) = string_mcode lp in
642 let (exp_n,exp) = expression exp in
643 let (rp_n,rp) = string_mcode rp in
644 let (branch1_n,branch1) = statement branch1 in
645 let (els_n,els) = string_mcode els in
646 let (branch2_n,branch2) = statement branch2 in
647 (multibind [iff_n;lp_n;exp_n;rp_n;branch1_n;els_n;branch2_n],
648 Ast0.IfThenElse(iff,lp,exp,rp,branch1,els,branch2,aft))
649 | Ast0.While(whl,lp,exp,rp,body,aft) ->
650 let (whl_n,whl) = string_mcode whl in
651 let (lp_n,lp) = string_mcode lp in
652 let (exp_n,exp) = expression exp in
653 let (rp_n,rp) = string_mcode rp in
654 let (body_n,body) = statement body in
655 (multibind [whl_n;lp_n;exp_n;rp_n;body_n],
656 Ast0.While(whl,lp,exp,rp,body,aft))
657 | Ast0.Do(d,body,whl,lp,exp,rp,sem) ->
658 let (d_n,d) = string_mcode d in
659 let (body_n,body) = statement body in
660 let (whl_n,whl) = string_mcode whl in
661 let (lp_n,lp) = string_mcode lp in
662 let (exp_n,exp) = expression exp in
663 let (rp_n,rp) = string_mcode rp in
664 let (sem_n,sem) = string_mcode sem in
665 (multibind [d_n;body_n;whl_n;lp_n;exp_n;rp_n;sem_n],
666 Ast0.Do(d,body,whl,lp,exp,rp,sem))
667 | Ast0.For(fr,lp,e1,sem1,e2,sem2,e3,rp,body,aft) ->
668 let (fr_n,fr) = string_mcode fr in
669 let (lp_n,lp) = string_mcode lp in
670 let (e1_n,e1) = get_option expression e1 in
671 let (sem1_n,sem1) = string_mcode sem1 in
672 let (e2_n,e2) = get_option expression e2 in
673 let (sem2_n,sem2) = string_mcode sem2 in
674 let (e3_n,e3) = get_option expression e3 in
675 let (rp_n,rp) = string_mcode rp in
676 let (body_n,body) = statement body in
677 (multibind [fr_n;lp_n;e1_n;sem1_n;e2_n;sem2_n;e3_n;rp_n;body_n],
678 Ast0.For(fr,lp,e1,sem1,e2,sem2,e3,rp,body,aft))
679 | Ast0.Iterator(nm,lp,args,rp,body,aft) ->
680 let (nm_n,nm) = ident nm in
681 let (lp_n,lp) = string_mcode lp in
682 let (args_n,args) = expression_dots args in
683 let (rp_n,rp) = string_mcode rp in
684 let (body_n,body) = statement body in
685 (multibind [nm_n;lp_n;args_n;rp_n;body_n],
686 Ast0.Iterator(nm,lp,args,rp,body,aft))
687 | Ast0.Switch(switch,lp,exp,rp,lb,decls,cases,rb) ->
688 let (switch_n,switch) = string_mcode switch in
689 let (lp_n,lp) = string_mcode lp in
690 let (exp_n,exp) = expression exp in
691 let (rp_n,rp) = string_mcode rp in
692 let (lb_n,lb) = string_mcode lb in
693 let (decls_n,decls) = statement_dots decls in
694 let (cases_n,cases) = case_line_dots cases in
695 let (rb_n,rb) = string_mcode rb in
696 (multibind [switch_n;lp_n;exp_n;rp_n;lb_n;decls_n;cases_n;rb_n],
697 Ast0.Switch(switch,lp,exp,rp,lb,decls,cases,rb))
698 | Ast0.Break(br,sem) ->
699 let (br_n,br) = string_mcode br in
700 let (sem_n,sem) = string_mcode sem in
701 (bind br_n sem_n, Ast0.Break(br,sem))
702 | Ast0.Continue(cont,sem) ->
703 let (cont_n,cont) = string_mcode cont in
704 let (sem_n,sem) = string_mcode sem in
705 (bind cont_n sem_n, Ast0.Continue(cont,sem))
706 | Ast0.Label(l,dd) ->
707 let (l_n,l) = ident l in
708 let (dd_n,dd) = string_mcode dd in
709 (bind l_n dd_n, Ast0.Label(l,dd))
710 | Ast0.Goto(goto,l,sem) ->
711 let (goto_n,goto) = string_mcode goto in
712 let (l_n,l) = ident l in
713 let (sem_n,sem) = string_mcode sem in
714 (bind goto_n (bind l_n sem_n), Ast0.Goto(goto,l,sem))
715 | Ast0.Return(ret,sem) ->
716 let (ret_n,ret) = string_mcode ret in
717 let (sem_n,sem) = string_mcode sem in
718 (bind ret_n sem_n, Ast0.Return(ret,sem))
719 | Ast0.ReturnExpr(ret,exp,sem) ->
720 let (ret_n,ret) = string_mcode ret in
721 let (exp_n,exp) = expression exp in
722 let (sem_n,sem) = string_mcode sem in
723 (multibind [ret_n;exp_n;sem_n], Ast0.ReturnExpr(ret,exp,sem))
724 | Ast0.MetaStmt(name,pure) ->
725 let (name_n,name) = meta_mcode name in
726 (name_n,Ast0.MetaStmt(name,pure))
727 | Ast0.MetaStmtList(name,pure) ->
728 let (name_n,name) = meta_mcode name in
729 (name_n,Ast0.MetaStmtList(name,pure))
730 | Ast0.Disj(starter,statement_dots_list,mids,ender) ->
731 do_disj starter statement_dots_list mids ender statement_dots
732 (fun starter statement_dots_list mids ender ->
733 Ast0.Disj(starter,statement_dots_list,mids,ender))
734 | Ast0.Nest(starter,stmt_dots,ender,whn,multi) ->
735 let (starter_n,starter) = string_mcode starter in
736 let (stmt_dots_n,stmt_dots) = statement_dots stmt_dots in
737 let (ender_n,ender) = string_mcode ender in
738 let (whn_n,whn) =
739 map_split_bind (whencode statement_dots statement) whn in
740 (multibind [starter_n;stmt_dots_n;ender_n;whn_n],
741 Ast0.Nest(starter,stmt_dots,ender,whn,multi))
742 | Ast0.Exp(exp) ->
743 let (exp_n,exp) = expression exp in
744 (exp_n,Ast0.Exp(exp))
745 | Ast0.TopExp(exp) ->
746 let (exp_n,exp) = expression exp in
747 (exp_n,Ast0.TopExp(exp))
748 | Ast0.Ty(ty) ->
749 let (ty_n,ty) = typeC ty in
750 (ty_n,Ast0.Ty(ty))
751 | Ast0.TopInit(init) ->
752 let (init_n,init) = initialiser init in
753 (init_n,Ast0.TopInit(init))
754 | Ast0.Dots(d,whn) ->
755 let (d_n,d) = string_mcode d in
756 let (whn_n,whn) =
757 map_split_bind (whencode statement_dots statement) whn in
758 (bind d_n whn_n, Ast0.Dots(d,whn))
759 | Ast0.Circles(d,whn) ->
760 let (d_n,d) = string_mcode d in
761 let (whn_n,whn) =
762 map_split_bind (whencode statement_dots statement) whn in
763 (bind d_n whn_n, Ast0.Circles(d,whn))
764 | Ast0.Stars(d,whn) ->
765 let (d_n,d) = string_mcode d in
766 let (whn_n,whn) =
767 map_split_bind (whencode statement_dots statement) whn in
768 (bind d_n whn_n, Ast0.Stars(d,whn))
769 | Ast0.Include(inc,name) ->
770 let (inc_n,inc) = string_mcode inc in
771 let (name_n,name) = inc_mcode name in
772 (bind inc_n name_n, Ast0.Include(inc,name))
773 | Ast0.Undef(def,id) ->
774 let (def_n,def) = string_mcode def in
775 let (id_n,id) = ident id in
776 (multibind [def_n;id_n],Ast0.Undef(def,id))
777 | Ast0.Define(def,id,params,body) ->
778 let (def_n,def) = string_mcode def in
779 let (id_n,id) = ident id in
780 let (params_n,params) = define_parameters params in
781 let (body_n,body) = statement_dots body in
782 (multibind [def_n;id_n;params_n;body_n],
783 Ast0.Define(def,id,params,body))
784 | Ast0.OptStm(re) ->
785 let (re_n,re) = statement re in (re_n,Ast0.OptStm(re))
786 | Ast0.UniqueStm(re) ->
787 let (re_n,re) = statement re in (re_n,Ast0.UniqueStm(re))
788 | Ast0.AsStmt(stm,asstm) ->
789 let (stm_n,stm) = statement stm in
790 let (asstm_n,asstm) = statement asstm in
791 (bind stm_n asstm_n, Ast0.AsStmt(stm,asstm))) in
792 let (n,s) = stmtfn all_functions k s in
793 (n,if mode = REBUILDER then process_bef_aft s else s)
794
795 (* not parameterizable for now... *)
796 and define_parameters p =
797 let k p =
798 rewrap p
799 (match Ast0.unwrap p with
800 Ast0.NoParams -> (option_default,Ast0.NoParams)
801 | Ast0.DParams(lp,params,rp) ->
802 let (lp_n,lp) = string_mcode lp in
803 let (params_n,params) = define_param_dots params in
804 let (rp_n,rp) = string_mcode rp in
805 (multibind [lp_n;params_n;rp_n], Ast0.DParams(lp,params,rp))) in
806 k p
807
808 and define_param_dots d =
809 let k d =
810 rewrap d
811 (match Ast0.unwrap d with
812 Ast0.DOTS(l) ->
813 let (n,l) = map_split_bind define_param l in (n,Ast0.DOTS(l))
814 | Ast0.CIRCLES(l) ->
815 let (n,l) = map_split_bind define_param l in (n,Ast0.CIRCLES(l))
816 | Ast0.STARS(l) ->
817 let (n,l) = map_split_bind define_param l in (n,Ast0.STARS(l))) in
818 k d
819
820 and define_param p =
821 let k p =
822 rewrap p
823 (match Ast0.unwrap p with
824 Ast0.DParam(id) -> let (n,id) = ident id in (n,Ast0.DParam(id))
825 | Ast0.DPComma(comma) ->
826 let (n,comma) = string_mcode comma in (n,Ast0.DPComma(comma))
827 | Ast0.DPdots(d) ->
828 let (n,d) = string_mcode d in (n,Ast0.DPdots(d))
829 | Ast0.DPcircles(c) ->
830 let (n,c) = string_mcode c in (n,Ast0.DPcircles(c))
831 | Ast0.OptDParam(dp) ->
832 let (n,dp) = define_param dp in (n,Ast0.OptDParam(dp))
833 | Ast0.UniqueDParam(dp) ->
834 let (n,dp) = define_param dp in (n,Ast0.UniqueDParam(dp))) in
835 k p
836
837 and fninfo = function
838 Ast0.FStorage(stg) ->
839 let (n,stg) = storage_mcode stg in (n,Ast0.FStorage(stg))
840 | Ast0.FType(ty) -> let (n,ty) = typeC ty in (n,Ast0.FType(ty))
841 | Ast0.FInline(inline) ->
842 let (n,inline) = string_mcode inline in (n,Ast0.FInline(inline))
843 | Ast0.FAttr(init) ->
844 let (n,init) = string_mcode init in (n,Ast0.FAttr(init))
845
846 and whencode notfn alwaysfn = function
847 Ast0.WhenNot a -> let (n,a) = notfn a in (n,Ast0.WhenNot(a))
848 | Ast0.WhenAlways a -> let (n,a) = alwaysfn a in (n,Ast0.WhenAlways(a))
849 | Ast0.WhenModifier(x) -> (option_default,Ast0.WhenModifier(x))
850 | Ast0.WhenNotTrue(e) ->
851 let (n,e) = expression e in (n,Ast0.WhenNotTrue(e))
852 | Ast0.WhenNotFalse(e) ->
853 let (n,e) = expression e in (n,Ast0.WhenNotFalse(e))
854
855 and case_line c =
856 let k c =
857 rewrap c
858 (match Ast0.unwrap c with
859 Ast0.Default(def,colon,code) ->
860 let (def_n,def) = string_mcode def in
861 let (colon_n,colon) = string_mcode colon in
862 let (code_n,code) = statement_dots code in
863 (multibind [def_n;colon_n;code_n], Ast0.Default(def,colon,code))
864 | Ast0.Case(case,exp,colon,code) ->
865 let (case_n,case) = string_mcode case in
866 let (exp_n,exp) = expression exp in
867 let (colon_n,colon) = string_mcode colon in
868 let (code_n,code) = statement_dots code in
869 (multibind [case_n;exp_n;colon_n;code_n],
870 Ast0.Case(case,exp,colon,code))
871 | Ast0.DisjCase(starter,case_lines,mids,ender) ->
872 do_disj starter case_lines mids ender case_line
873 (fun starter case_lines mids ender ->
874 Ast0.DisjCase(starter,case_lines,mids,ender))
875 | Ast0.OptCase(case) ->
876 let (n,case) = case_line case in (n,Ast0.OptCase(case))) in
877 casefn all_functions k c
878
879 and top_level t =
880 let k t =
881 rewrap t
882 (match Ast0.unwrap t with
883 Ast0.FILEINFO(old_file,new_file) ->
884 let (old_file_n,old_file) = string_mcode old_file in
885 let (new_file_n,new_file) = string_mcode new_file in
886 (bind old_file_n new_file_n,Ast0.FILEINFO(old_file,new_file))
887 | Ast0.NONDECL(statement_dots) ->
888 let (n,statement_dots) = statement statement_dots in
889 (n,Ast0.NONDECL(statement_dots))
890 | Ast0.CODE(stmt_dots) ->
891 let (stmt_dots_n,stmt_dots) = statement_dots stmt_dots in
892 (stmt_dots_n, Ast0.CODE(stmt_dots))
893 | Ast0.TOPCODE(stmt_dots) ->
894 let (stmt_dots_n,stmt_dots) = statement_dots stmt_dots in
895 (stmt_dots_n, Ast0.TOPCODE(stmt_dots))
896 | Ast0.ERRORWORDS(exps) ->
897 let (n,exps) = map_split_bind expression exps in
898 (n, Ast0.ERRORWORDS(exps))
899 | Ast0.OTHER(_) -> failwith "unexpected code") in
900 topfn all_functions k t
901
902 and anything a = (* for compile_iso, not parameterisable *)
903 let k = function
904 Ast0.DotsExprTag(exprs) ->
905 let (exprs_n,exprs) = expression_dots exprs in
906 (exprs_n,Ast0.DotsExprTag(exprs))
907 | Ast0.DotsInitTag(inits) ->
908 let (inits_n,inits) = initialiser_list inits in
909 (inits_n,Ast0.DotsInitTag(inits))
910 | Ast0.DotsParamTag(params) ->
911 let (params_n,params) = parameter_list params in
912 (params_n,Ast0.DotsParamTag(params))
913 | Ast0.DotsStmtTag(stmts) ->
914 let (stmts_n,stmts) = statement_dots stmts in
915 (stmts_n,Ast0.DotsStmtTag(stmts))
916 | Ast0.DotsDeclTag(decls) ->
917 let (decls_n,decls) = declaration_dots decls in
918 (decls_n,Ast0.DotsDeclTag(decls))
919 | Ast0.DotsCaseTag(cases) ->
920 let (cases_n,cases) = case_line_dots cases in
921 (cases_n,Ast0.DotsCaseTag(cases))
922 | Ast0.IdentTag(id) ->
923 let (id_n,id) = ident id in
924 (id_n,Ast0.IdentTag(id))
925 | Ast0.ExprTag(exp) ->
926 let (exp_n,exp) = expression exp in
927 (exp_n,Ast0.ExprTag(exp))
928 | Ast0.ArgExprTag(exp) ->
929 let (exp_n,exp) = expression exp in
930 (exp_n,Ast0.ArgExprTag(exp))
931 | Ast0.TestExprTag(exp) ->
932 let (exp_n,exp) = expression exp in
933 (exp_n,Ast0.TestExprTag(exp))
934 | Ast0.TypeCTag(ty) ->
935 let (ty_n,ty) = typeC ty in
936 (ty_n,Ast0.TypeCTag(ty))
937 | Ast0.ParamTag(param) ->
938 let (param_n,param) = parameterTypeDef param in
939 (param_n,Ast0.ParamTag(param))
940 | Ast0.InitTag(init) ->
941 let (init_n,init) = initialiser init in
942 (init_n,Ast0.InitTag(init))
943 | Ast0.DeclTag(decl) ->
944 let (decl_n,decl) = declaration decl in
945 (decl_n,Ast0.DeclTag(decl))
946 | Ast0.StmtTag(stmt) ->
947 let (stmt_n,stmt) = statement stmt in
948 (stmt_n,Ast0.StmtTag(stmt))
949 | Ast0.CaseLineTag(c) ->
950 let (c_n,c) = case_line c in
951 (c_n,Ast0.CaseLineTag(c))
952 | Ast0.TopTag(top) ->
953 let (top_n,top) = top_level top in
954 (top_n,Ast0.TopTag(top))
955 | Ast0.IsoWhenTag(x) -> (option_default,Ast0.IsoWhenTag(x))
956 | Ast0.IsoWhenTTag(e) ->
957 let (e_n,e) = expression e in
958 (e_n,Ast0.IsoWhenTTag(e))
959 | Ast0.IsoWhenFTag(e) ->
960 let (e_n,e) = expression e in
961 (e_n,Ast0.IsoWhenFTag(e))
962 | Ast0.MetaPosTag(var) -> failwith "not supported"
963 | Ast0.HiddenVarTag(var) -> failwith "not supported" in
964 k a
965
966 (* not done for combiner, because the statement is assumed to be already
967 represented elsewhere in the code *)
968
969 and all_functions =
970 {VT0.ident = ident;
971 VT0.expression = expression;
972 VT0.typeC = typeC;
973 VT0.declaration = declaration;
974 VT0.initialiser = initialiser;
975 VT0.initialiser_list = initialiser_list;
976 VT0.parameter = parameterTypeDef;
977 VT0.parameter_list = parameter_list;
978 VT0.statement = statement;
979 VT0.case_line = case_line;
980 VT0.top_level = top_level;
981 VT0.expression_dots = expression_dots;
982 VT0.statement_dots = statement_dots;
983 VT0.declaration_dots = declaration_dots;
984 VT0.case_line_dots = case_line_dots;
985 VT0.anything = anything} in
986 all_functions
987
988 let combiner_functions =
989 {VT0.combiner_meta_mcode = (fun opt_default mc -> opt_default);
990 VT0.combiner_string_mcode = (fun opt_default mc -> opt_default);
991 VT0.combiner_const_mcode = (fun opt_default mc -> opt_default);
992 VT0.combiner_assign_mcode = (fun opt_default mc -> opt_default);
993 VT0.combiner_fix_mcode = (fun opt_default mc -> opt_default);
994 VT0.combiner_unary_mcode = (fun opt_default mc -> opt_default);
995 VT0.combiner_binary_mcode = (fun opt_default mc -> opt_default);
996 VT0.combiner_cv_mcode = (fun opt_default mc -> opt_default);
997 VT0.combiner_sign_mcode = (fun opt_default mc -> opt_default);
998 VT0.combiner_struct_mcode = (fun opt_default mc -> opt_default);
999 VT0.combiner_storage_mcode = (fun opt_default mc -> opt_default);
1000 VT0.combiner_inc_mcode = (fun opt_default mc -> opt_default);
1001 VT0.combiner_dotsexprfn = (fun r k e -> k e);
1002 VT0.combiner_dotsinitfn = (fun r k e -> k e);
1003 VT0.combiner_dotsparamfn = (fun r k e -> k e);
1004 VT0.combiner_dotsstmtfn = (fun r k e -> k e);
1005 VT0.combiner_dotsdeclfn = (fun r k e -> k e);
1006 VT0.combiner_dotscasefn = (fun r k e -> k e);
1007 VT0.combiner_identfn = (fun r k e -> k e);
1008 VT0.combiner_exprfn = (fun r k e -> k e);
1009 VT0.combiner_tyfn = (fun r k e -> k e);
1010 VT0.combiner_initfn = (fun r k e -> k e);
1011 VT0.combiner_paramfn = (fun r k e -> k e);
1012 VT0.combiner_declfn = (fun r k e -> k e);
1013 VT0.combiner_stmtfn = (fun r k e -> k e);
1014 VT0.combiner_casefn = (fun r k e -> k e);
1015 VT0.combiner_topfn = (fun r k e -> k e)}
1016
1017 let combiner_dz r =
1018 {VT0.combiner_rec_ident =
1019 (function e -> let (n,_) = r.VT0.ident e in n);
1020 VT0.combiner_rec_expression =
1021 (function e -> let (n,_) = r.VT0.expression e in n);
1022 VT0.combiner_rec_typeC =
1023 (function e -> let (n,_) = r.VT0.typeC e in n);
1024 VT0.combiner_rec_declaration =
1025 (function e -> let (n,_) = r.VT0.declaration e in n);
1026 VT0.combiner_rec_initialiser =
1027 (function e -> let (n,_) = r.VT0.initialiser e in n);
1028 VT0.combiner_rec_initialiser_list =
1029 (function e -> let (n,_) = r.VT0.initialiser_list e in n);
1030 VT0.combiner_rec_parameter =
1031 (function e -> let (n,_) = r.VT0.parameter e in n);
1032 VT0.combiner_rec_parameter_list =
1033 (function e -> let (n,_) = r.VT0.parameter_list e in n);
1034 VT0.combiner_rec_statement =
1035 (function e -> let (n,_) = r.VT0.statement e in n);
1036 VT0.combiner_rec_case_line =
1037 (function e -> let (n,_) = r.VT0.case_line e in n);
1038 VT0.combiner_rec_top_level =
1039 (function e -> let (n,_) = r.VT0.top_level e in n);
1040 VT0.combiner_rec_expression_dots =
1041 (function e -> let (n,_) = r.VT0.expression_dots e in n);
1042 VT0.combiner_rec_statement_dots =
1043 (function e -> let (n,_) = r.VT0.statement_dots e in n);
1044 VT0.combiner_rec_declaration_dots =
1045 (function e -> let (n,_) = r.VT0.declaration_dots e in n);
1046 VT0.combiner_rec_case_line_dots =
1047 (function e -> let (n,_) = r.VT0.case_line_dots e in n);
1048 VT0.combiner_rec_anything =
1049 (function e -> let (n,_) = r.VT0.anything e in n)}
1050
1051 let combiner bind option_default functions =
1052 let xk k e = let (n,_) = k e in n in
1053 let dz = combiner_dz in
1054 combiner_dz
1055 (visitor COMBINER bind option_default
1056 (function mc -> (functions.VT0.combiner_meta_mcode option_default mc,mc))
1057 (function mc -> (functions.VT0.combiner_string_mcode option_default mc,mc))
1058 (function mc -> (functions.VT0.combiner_const_mcode option_default mc,mc))
1059 (function mc -> (functions.VT0.combiner_assign_mcode option_default mc,mc))
1060 (function mc -> (functions.VT0.combiner_fix_mcode option_default mc,mc))
1061 (function mc -> (functions.VT0.combiner_unary_mcode option_default mc,mc))
1062 (function mc -> (functions.VT0.combiner_binary_mcode option_default mc,mc))
1063 (function mc -> (functions.VT0.combiner_cv_mcode option_default mc,mc))
1064 (function mc -> (functions.VT0.combiner_sign_mcode option_default mc,mc))
1065 (function mc -> (functions.VT0.combiner_struct_mcode option_default mc,mc))
1066 (function mc ->
1067 (functions.VT0.combiner_storage_mcode option_default mc,mc))
1068 (function mc -> (functions.VT0.combiner_inc_mcode option_default mc,mc))
1069 (fun r k e -> (functions.VT0.combiner_dotsexprfn (dz r) (xk k) e, e))
1070 (fun r k e -> (functions.VT0.combiner_dotsinitfn (dz r) (xk k) e, e))
1071 (fun r k e -> (functions.VT0.combiner_dotsparamfn (dz r) (xk k) e, e))
1072 (fun r k e -> (functions.VT0.combiner_dotsstmtfn (dz r) (xk k) e, e))
1073 (fun r k e -> (functions.VT0.combiner_dotsdeclfn (dz r) (xk k) e, e))
1074 (fun r k e -> (functions.VT0.combiner_dotscasefn (dz r) (xk k) e, e))
1075 (fun r k e -> (functions.VT0.combiner_identfn (dz r) (xk k) e, e))
1076 (fun r k e -> (functions.VT0.combiner_exprfn (dz r) (xk k) e, e))
1077 (fun r k e -> (functions.VT0.combiner_tyfn (dz r) (xk k) e, e))
1078 (fun r k e -> (functions.VT0.combiner_initfn (dz r) (xk k) e, e))
1079 (fun r k e -> (functions.VT0.combiner_paramfn (dz r) (xk k) e, e))
1080 (fun r k e -> (functions.VT0.combiner_declfn (dz r) (xk k) e, e))
1081 (fun r k e -> (functions.VT0.combiner_stmtfn (dz r) (xk k) e, e))
1082 (fun r k e -> (functions.VT0.combiner_casefn (dz r) (xk k) e, e))
1083 (fun r k e -> (functions.VT0.combiner_topfn (dz r) (xk k) e, e)))
1084
1085 let flat_combiner bind option_default
1086 meta_mcode string_mcode const_mcode assign_mcode fix_mcode unary_mcode
1087 binary_mcode cv_mcode sign_mcode struct_mcode storage_mcode
1088 inc_mcode
1089 dotsexprfn dotsinitfn dotsparamfn dotsstmtfn dotsdeclfn dotscasefn
1090 identfn exprfn tyfn initfn paramfn declfn stmtfn casefn topfn =
1091 let dz = combiner_dz in
1092 let xk k e = let (n,_) = k e in n in
1093 combiner_dz (visitor COMBINER bind option_default
1094 (function mc -> (meta_mcode mc,mc))
1095 (function mc -> (string_mcode mc,mc))
1096 (function mc -> (const_mcode mc,mc))
1097 (function mc -> (assign_mcode mc,mc))
1098 (function mc -> (fix_mcode mc,mc))
1099 (function mc -> (unary_mcode mc,mc))
1100 (function mc -> (binary_mcode mc,mc))
1101 (function mc -> (cv_mcode mc,mc))
1102 (function mc -> (sign_mcode mc,mc))
1103 (function mc -> (struct_mcode mc,mc))
1104 (function mc -> (storage_mcode mc,mc))
1105 (function mc -> (inc_mcode mc,mc))
1106 (fun r k e -> (dotsexprfn (dz r) (xk k) e, e))
1107 (fun r k e -> (dotsinitfn (dz r) (xk k) e, e))
1108 (fun r k e -> (dotsparamfn (dz r) (xk k) e, e))
1109 (fun r k e -> (dotsstmtfn (dz r) (xk k) e, e))
1110 (fun r k e -> (dotsdeclfn (dz r) (xk k) e, e))
1111 (fun r k e -> (dotscasefn (dz r) (xk k) e, e))
1112 (fun r k e -> (identfn (dz r) (xk k) e, e))
1113 (fun r k e -> (exprfn (dz r) (xk k) e, e))
1114 (fun r k e -> (tyfn (dz r) (xk k) e, e))
1115 (fun r k e -> (initfn (dz r) (xk k) e, e))
1116 (fun r k e -> (paramfn (dz r) (xk k) e, e))
1117 (fun r k e -> (declfn (dz r) (xk k) e, e))
1118 (fun r k e -> (stmtfn (dz r) (xk k) e, e))
1119 (fun r k e -> (casefn (dz r) (xk k) e, e))
1120 (fun r k e -> (topfn (dz r) (xk k) e, e)))
1121
1122 let rebuilder_functions =
1123 {VT0.rebuilder_meta_mcode = (fun mc -> mc);
1124 VT0.rebuilder_string_mcode = (fun mc -> mc);
1125 VT0.rebuilder_const_mcode = (fun mc -> mc);
1126 VT0.rebuilder_assign_mcode = (fun mc -> mc);
1127 VT0.rebuilder_fix_mcode = (fun mc -> mc);
1128 VT0.rebuilder_unary_mcode = (fun mc -> mc);
1129 VT0.rebuilder_binary_mcode = (fun mc -> mc);
1130 VT0.rebuilder_cv_mcode = (fun mc -> mc);
1131 VT0.rebuilder_sign_mcode = (fun mc -> mc);
1132 VT0.rebuilder_struct_mcode = (fun mc -> mc);
1133 VT0.rebuilder_storage_mcode = (fun mc -> mc);
1134 VT0.rebuilder_inc_mcode = (fun mc -> mc);
1135 VT0.rebuilder_dotsexprfn = (fun r k e -> k e);
1136 VT0.rebuilder_dotsinitfn = (fun r k e -> k e);
1137 VT0.rebuilder_dotsparamfn = (fun r k e -> k e);
1138 VT0.rebuilder_dotsstmtfn = (fun r k e -> k e);
1139 VT0.rebuilder_dotsdeclfn = (fun r k e -> k e);
1140 VT0.rebuilder_dotscasefn = (fun r k e -> k e);
1141 VT0.rebuilder_identfn = (fun r k e -> k e);
1142 VT0.rebuilder_exprfn = (fun r k e -> k e);
1143 VT0.rebuilder_tyfn = (fun r k e -> k e);
1144 VT0.rebuilder_initfn = (fun r k e -> k e);
1145 VT0.rebuilder_paramfn = (fun r k e -> k e);
1146 VT0.rebuilder_declfn = (fun r k e -> k e);
1147 VT0.rebuilder_stmtfn = (fun r k e -> k e);
1148 VT0.rebuilder_casefn = (fun r k e -> k e);
1149 VT0.rebuilder_topfn = (fun r k e -> k e)}
1150
1151 let rebuilder_dz r =
1152 {VT0.rebuilder_rec_ident =
1153 (function e -> let (_,e) = r.VT0.ident e in e);
1154 VT0.rebuilder_rec_expression =
1155 (function e -> let (_,e) = r.VT0.expression e in e);
1156 VT0.rebuilder_rec_typeC =
1157 (function e -> let (_,e) = r.VT0.typeC e in e);
1158 VT0.rebuilder_rec_declaration =
1159 (function e -> let (_,e) = r.VT0.declaration e in e);
1160 VT0.rebuilder_rec_initialiser =
1161 (function e -> let (_,e) = r.VT0.initialiser e in e);
1162 VT0.rebuilder_rec_initialiser_list =
1163 (function e -> let (_,e) = r.VT0.initialiser_list e in e);
1164 VT0.rebuilder_rec_parameter =
1165 (function e -> let (_,e) = r.VT0.parameter e in e);
1166 VT0.rebuilder_rec_parameter_list =
1167 (function e -> let (_,e) = r.VT0.parameter_list e in e);
1168 VT0.rebuilder_rec_statement =
1169 (function e -> let (_,e) = r.VT0.statement e in e);
1170 VT0.rebuilder_rec_case_line =
1171 (function e -> let (_,e) = r.VT0.case_line e in e);
1172 VT0.rebuilder_rec_top_level =
1173 (function e -> let (_,e) = r.VT0.top_level e in e);
1174 VT0.rebuilder_rec_expression_dots =
1175 (function e -> let (_,e) = r.VT0.expression_dots e in e);
1176 VT0.rebuilder_rec_statement_dots =
1177 (function e -> let (_,e) = r.VT0.statement_dots e in e);
1178 VT0.rebuilder_rec_declaration_dots =
1179 (function e -> let (_,e) = r.VT0.declaration_dots e in e);
1180 VT0.rebuilder_rec_case_line_dots =
1181 (function e -> let (_,e) = r.VT0.case_line_dots e in e);
1182 VT0.rebuilder_rec_anything =
1183 (function e -> let (_,e) = r.VT0.anything e in e)}
1184
1185 let rebuilder functions =
1186 let dz = rebuilder_dz in
1187 let xk k e = let (_,e) = k e in e in
1188 rebuilder_dz
1189 (visitor REBUILDER (fun x y -> x) ()
1190 (function mc -> ((),functions.VT0.rebuilder_meta_mcode mc))
1191 (function mc -> ((),functions.VT0.rebuilder_string_mcode mc))
1192 (function mc -> ((),functions.VT0.rebuilder_const_mcode mc))
1193 (function mc -> ((),functions.VT0.rebuilder_assign_mcode mc))
1194 (function mc -> ((),functions.VT0.rebuilder_fix_mcode mc))
1195 (function mc -> ((),functions.VT0.rebuilder_unary_mcode mc))
1196 (function mc -> ((),functions.VT0.rebuilder_binary_mcode mc))
1197 (function mc -> ((),functions.VT0.rebuilder_cv_mcode mc))
1198 (function mc -> ((),functions.VT0.rebuilder_sign_mcode mc))
1199 (function mc -> ((),functions.VT0.rebuilder_struct_mcode mc))
1200 (function mc -> ((),functions.VT0.rebuilder_storage_mcode mc))
1201 (function mc -> ((),functions.VT0.rebuilder_inc_mcode mc))
1202 (fun r k e -> ((),functions.VT0.rebuilder_dotsexprfn (dz r) (xk k) e))
1203 (fun r k e -> ((),functions.VT0.rebuilder_dotsinitfn (dz r) (xk k) e))
1204 (fun r k e -> ((),functions.VT0.rebuilder_dotsparamfn (dz r) (xk k) e))
1205 (fun r k e -> ((),functions.VT0.rebuilder_dotsstmtfn (dz r) (xk k) e))
1206 (fun r k e -> ((),functions.VT0.rebuilder_dotsdeclfn (dz r) (xk k) e))
1207 (fun r k e -> ((),functions.VT0.rebuilder_dotscasefn (dz r) (xk k) e))
1208 (fun r k e -> ((),functions.VT0.rebuilder_identfn (dz r) (xk k) e))
1209 (fun r k e -> ((),functions.VT0.rebuilder_exprfn (dz r) (xk k) e))
1210 (fun r k e -> ((),functions.VT0.rebuilder_tyfn (dz r) (xk k) e))
1211 (fun r k e -> ((),functions.VT0.rebuilder_initfn (dz r) (xk k) e))
1212 (fun r k e -> ((),functions.VT0.rebuilder_paramfn (dz r) (xk k) e))
1213 (fun r k e -> ((),functions.VT0.rebuilder_declfn (dz r) (xk k) e))
1214 (fun r k e -> ((),functions.VT0.rebuilder_stmtfn (dz r) (xk k) e))
1215 (fun r k e -> ((),functions.VT0.rebuilder_casefn (dz r) (xk k) e))
1216 (fun r k e -> ((),functions.VT0.rebuilder_topfn (dz r) (xk k) e)))
1217
1218 let flat_rebuilder
1219 meta_mcode string_mcode const_mcode assign_mcode fix_mcode unary_mcode
1220 binary_mcode cv_mcode sign_mcode struct_mcode storage_mcode
1221 inc_mcode
1222 dotsexprfn dotsinitfn dotsparamfn dotsstmtfn dotsdeclfn dotscasefn
1223 identfn exprfn tyfn initfn paramfn declfn stmtfn casefn topfn =
1224 let dz = rebuilder_dz in
1225 let xk k e = let (_,e) = k e in e in
1226 rebuilder_dz
1227 (visitor REBUILDER (fun x y -> x) ()
1228 (function mc -> ((),meta_mcode mc))
1229 (function mc -> ((),string_mcode mc))
1230 (function mc -> ((),const_mcode mc))
1231 (function mc -> ((),assign_mcode mc))
1232 (function mc -> ((),fix_mcode mc))
1233 (function mc -> ((),unary_mcode mc))
1234 (function mc -> ((),binary_mcode mc))
1235 (function mc -> ((),cv_mcode mc))
1236 (function mc -> ((),sign_mcode mc))
1237 (function mc -> ((),struct_mcode mc))
1238 (function mc -> ((),storage_mcode mc))
1239 (function mc -> ((),inc_mcode mc))
1240 (fun r k e -> ((),dotsexprfn (dz r) (xk k) e))
1241 (fun r k e -> ((),dotsinitfn (dz r) (xk k) e))
1242 (fun r k e -> ((),dotsparamfn (dz r) (xk k) e))
1243 (fun r k e -> ((),dotsstmtfn (dz r) (xk k) e))
1244 (fun r k e -> ((),dotsdeclfn (dz r) (xk k) e))
1245 (fun r k e -> ((),dotscasefn (dz r) (xk k) e))
1246 (fun r k e -> ((),identfn (dz r) (xk k) e))
1247 (fun r k e -> ((),exprfn (dz r) (xk k) e))
1248 (fun r k e -> ((),tyfn (dz r) (xk k) e))
1249 (fun r k e -> ((),initfn (dz r) (xk k) e))
1250 (fun r k e -> ((),paramfn (dz r) (xk k) e))
1251 (fun r k e -> ((),declfn (dz r) (xk k) e))
1252 (fun r k e -> ((),stmtfn (dz r) (xk k) e))
1253 (fun r k e -> ((),casefn (dz r) (xk k) e))
1254 (fun r k e -> ((),topfn (dz r) (xk k) e)))
1255
1256 let combiner_rebuilder_functions =
1257 {VT0.combiner_rebuilder_meta_mcode =
1258 (fun opt_default mc -> (opt_default,mc));
1259 VT0.combiner_rebuilder_string_mcode =
1260 (fun opt_default mc -> (opt_default,mc));
1261 VT0.combiner_rebuilder_const_mcode =
1262 (fun opt_default mc -> (opt_default,mc));
1263 VT0.combiner_rebuilder_assign_mcode =
1264 (fun opt_default mc -> (opt_default,mc));
1265 VT0.combiner_rebuilder_fix_mcode =
1266 (fun opt_default mc -> (opt_default,mc));
1267 VT0.combiner_rebuilder_unary_mcode =
1268 (fun opt_default mc -> (opt_default,mc));
1269 VT0.combiner_rebuilder_binary_mcode =
1270 (fun opt_default mc -> (opt_default,mc));
1271 VT0.combiner_rebuilder_cv_mcode =
1272 (fun opt_default mc -> (opt_default,mc));
1273 VT0.combiner_rebuilder_sign_mcode =
1274 (fun opt_default mc -> (opt_default,mc));
1275 VT0.combiner_rebuilder_struct_mcode =
1276 (fun opt_default mc -> (opt_default,mc));
1277 VT0.combiner_rebuilder_storage_mcode =
1278 (fun opt_default mc -> (opt_default,mc));
1279 VT0.combiner_rebuilder_inc_mcode =
1280 (fun opt_default mc -> (opt_default,mc));
1281 VT0.combiner_rebuilder_dotsexprfn = (fun r k e -> k e);
1282 VT0.combiner_rebuilder_dotsinitfn = (fun r k e -> k e);
1283 VT0.combiner_rebuilder_dotsparamfn = (fun r k e -> k e);
1284 VT0.combiner_rebuilder_dotsstmtfn = (fun r k e -> k e);
1285 VT0.combiner_rebuilder_dotsdeclfn = (fun r k e -> k e);
1286 VT0.combiner_rebuilder_dotscasefn = (fun r k e -> k e);
1287 VT0.combiner_rebuilder_identfn = (fun r k e -> k e);
1288 VT0.combiner_rebuilder_exprfn = (fun r k e -> k e);
1289 VT0.combiner_rebuilder_tyfn = (fun r k e -> k e);
1290 VT0.combiner_rebuilder_initfn = (fun r k e -> k e);
1291 VT0.combiner_rebuilder_paramfn = (fun r k e -> k e);
1292 VT0.combiner_rebuilder_declfn = (fun r k e -> k e);
1293 VT0.combiner_rebuilder_stmtfn = (fun r k e -> k e);
1294 VT0.combiner_rebuilder_casefn = (fun r k e -> k e);
1295 VT0.combiner_rebuilder_topfn = (fun r k e -> k e)}
1296
1297 let combiner_rebuilder bind option_default functions =
1298 visitor BOTH bind option_default
1299 (functions.VT0.combiner_rebuilder_meta_mcode option_default)
1300 (functions.VT0.combiner_rebuilder_string_mcode option_default)
1301 (functions.VT0.combiner_rebuilder_const_mcode option_default)
1302 (functions.VT0.combiner_rebuilder_assign_mcode option_default)
1303 (functions.VT0.combiner_rebuilder_fix_mcode option_default)
1304 (functions.VT0.combiner_rebuilder_unary_mcode option_default)
1305 (functions.VT0.combiner_rebuilder_binary_mcode option_default)
1306 (functions.VT0.combiner_rebuilder_cv_mcode option_default)
1307 (functions.VT0.combiner_rebuilder_sign_mcode option_default)
1308 (functions.VT0.combiner_rebuilder_struct_mcode option_default)
1309 (functions.VT0.combiner_rebuilder_storage_mcode option_default)
1310 (functions.VT0.combiner_rebuilder_inc_mcode option_default)
1311 functions.VT0.combiner_rebuilder_dotsexprfn
1312 functions.VT0.combiner_rebuilder_dotsinitfn
1313 functions.VT0.combiner_rebuilder_dotsparamfn
1314 functions.VT0.combiner_rebuilder_dotsstmtfn
1315 functions.VT0.combiner_rebuilder_dotsdeclfn
1316 functions.VT0.combiner_rebuilder_dotscasefn
1317 functions.VT0.combiner_rebuilder_identfn
1318 functions.VT0.combiner_rebuilder_exprfn
1319 functions.VT0.combiner_rebuilder_tyfn
1320 functions.VT0.combiner_rebuilder_initfn
1321 functions.VT0.combiner_rebuilder_paramfn
1322 functions.VT0.combiner_rebuilder_declfn
1323 functions.VT0.combiner_rebuilder_stmtfn
1324 functions.VT0.combiner_rebuilder_casefn
1325 functions.VT0.combiner_rebuilder_topfn