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