2 * Copyright 2010, INRIA, University of Copenhagen
3 * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
4 * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
5 * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
6 * This file is part of Coccinelle.
8 * Coccinelle is free software: you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation, according to version 2 of the License.
12 * Coccinelle is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Coccinelle. If not, see <http://www.gnu.org/licenses/>.
20 * The authors reserve the right to distribute this or future versions of
21 * Coccinelle under other licenses.
25 module Ast
= Ast_cocci
26 module TC
= Type_cocci
28 (* --------------------------------------------------------------------- *)
31 type arity
= OPT
| UNIQUE
| NONE
34 { tline_start
: int; tline_end
: int;
35 left_offset
: int; right_offset
: int }
36 let default_token_info =
37 { tline_start
= -1; tline_end
= -1; left_offset
= -1; right_offset
= -1 }
39 (* MIXED is like CONTEXT, since sometimes MIXED things have to revert to
40 CONTEXT - see insert_plus.ml *)
41 type count
= ONE
(* + *) | MANY
(* ++ *)
44 MINUS
of (Ast.anything list list
* token_info
) ref
46 | CONTEXT
of (Ast.anything
Ast.befaft
* token_info
* token_info
) ref
47 | MIXED
of (Ast.anything
Ast.befaft
* token_info
* token_info
) ref
49 type position_info
= { line_start
: int; line_end
: int;
50 logical_start
: int; logical_end
: int;
51 column
: int; offset
: int; }
53 type info
= { pos_info
: position_info
;
54 attachable_start
: bool; attachable_end
: bool;
55 mcode_start
: mcodekind list
; mcode_end
: mcodekind list
;
56 (* the following are only for + code *)
57 strings_before
: (Ast.added_string
* position_info
) list
;
58 strings_after
: (Ast.added_string
* position_info
) list
}
60 (* adjacency index is incremented when we skip over dots or nest delimiters
61 it is used in deciding how much to remove, when two adjacent code tokens are
64 'a
* arity
* info
* mcodekind
* meta_pos
ref (* pos, - only *) *
65 int (* adjacency_index *)
66 (* int ref is an index *)
71 mcodekind
: mcodekind
ref;
72 exp_ty
: TC.typeC
option ref; (* only for expressions *)
73 bef_aft
: dots_bef_aft
; (* only for statements *)
74 true_if_arg
: bool; (* true if "arg_exp", only for exprs *)
75 true_if_test
: bool; (* true if "test position", only for exprs *)
76 true_if_test_exp
: bool;(* true if "test_exp from iso", only for exprs *)
77 (*nonempty if this represents the use of an iso*)
78 iso_info
: (string*anything
) list
}
81 NoDots
| AddingBetweenDots
of statement
| DroppingBetweenDots
of statement
83 (* for iso metavariables, true if they can only match nonmodified terms with
84 all metavariables unitary
85 for SP metavariables, true if the metavariable is unitary (valid up to
86 isomorphism phase only)
87 In SP, the only options are impure and context
89 and pure
= Impure
| Pure
| Context
| PureContext
(* pure and only context *)
91 (* --------------------------------------------------------------------- *)
92 (* --------------------------------------------------------------------- *)
100 and 'a dots
= 'a base_dots wrap
102 (* --------------------------------------------------------------------- *)
107 | MetaId
of Ast.meta_name mcode
* Ast.idconstraint
* pure
108 | MetaFunc
of Ast.meta_name mcode
* Ast.idconstraint
* pure
109 | MetaLocalFunc
of Ast.meta_name mcode
* Ast.idconstraint
* pure
111 | UniqueIdent
of ident
113 and ident
= base_ident wrap
115 (* --------------------------------------------------------------------- *)
118 and base_expression
=
120 | Constant
of Ast.constant mcode
121 | FunCall
of expression
* string mcode
(* ( *) *
122 expression dots
* string mcode
(* ) *)
123 | Assignment
of expression
* Ast.assignOp mcode
* expression
*
124 bool (* true if it can match an initialization *)
125 | CondExpr
of expression
* string mcode
(* ? *) * expression
option *
126 string mcode
(* : *) * expression
127 | Postfix
of expression
* Ast.fixOp mcode
128 | Infix
of expression
* Ast.fixOp mcode
129 | Unary
of expression
* Ast.unaryOp mcode
130 | Binary
of expression
* Ast.binaryOp mcode
* expression
131 | Nested
of expression
* Ast.binaryOp mcode
* expression
132 | Paren
of string mcode
(* ( *) * expression
*
134 | ArrayAccess
of expression
* string mcode
(* [ *) * expression
*
136 | RecordAccess
of expression
* string mcode
(* . *) * ident
137 | RecordPtAccess
of expression
* string mcode
(* -> *) * ident
138 | Cast
of string mcode
(* ( *) * typeC
* string mcode
(* ) *) *
140 | SizeOfExpr
of string mcode
(* sizeof *) * expression
141 | SizeOfType
of string mcode
(* sizeof *) * string mcode
(* ( *) *
142 typeC
* string mcode
(* ) *)
143 | TypeExp
of typeC
(* type name used as an expression, only in args *)
144 | MetaErr
of Ast.meta_name mcode
* constraints
* pure
145 | MetaExpr
of Ast.meta_name mcode
* constraints
*
146 TC.typeC list
option * Ast.form
* pure
147 | MetaExprList
of Ast.meta_name mcode
(* only in arg lists *) *
149 | EComma
of string mcode
(* only in arg lists *)
150 | DisjExpr
of string mcode
* expression list
*
151 string mcode list
(* the |s *) * string mcode
152 | NestExpr
of string mcode
* expression dots
* string mcode
*
153 expression
option * Ast.multi
154 | Edots
of string mcode
(* ... *) * expression
option
155 | Ecircles
of string mcode
(* ooo *) * expression
option
156 | Estars
of string mcode
(* *** *) * expression
option
157 | OptExp
of expression
158 | UniqueExp
of expression
160 and expression
= base_expression wrap
164 | NotIdCstrt
of Ast.reconstraint
165 | NotExpCstrt
of expression list
166 | SubExpCstrt
of Ast.meta_name list
169 MetaListLen
of Ast.meta_name mcode
173 (* --------------------------------------------------------------------- *)
177 ConstVol
of Ast.const_vol mcode
* typeC
178 | BaseType
of Ast.baseType
* string mcode list
179 | Signed
of Ast.sign mcode
* typeC
option
180 | Pointer
of typeC
* string mcode
(* * *)
181 | FunctionPointer
of typeC
*
182 string mcode
(* ( *)*string mcode
(* * *)*string mcode
(* ) *)*
183 string mcode
(* ( *)*parameter_list
*string mcode
(* ) *)
184 | FunctionType
of typeC
option *
185 string mcode
(* ( *) * parameter_list
*
187 | Array
of typeC
* string mcode
(* [ *) *
188 expression
option * string mcode
(* ] *)
189 | EnumName
of string mcode
(*enum*) * ident
option (* name *)
190 | EnumDef
of typeC
(* either StructUnionName or metavar *) *
191 string mcode
(* { *) * expression dots
* string mcode
(* } *)
192 | StructUnionName
of Ast.structUnion mcode
* ident
option (* name *)
193 | StructUnionDef
of typeC
(* either StructUnionName or metavar *) *
194 string mcode
(* { *) * declaration dots
* string mcode
(* } *)
195 | TypeName
of string mcode
196 | MetaType
of Ast.meta_name mcode
* pure
197 | DisjType
of string mcode
* typeC list
* (* only after iso *)
198 string mcode list
(* the |s *) * string mcode
200 | UniqueType
of typeC
202 and typeC
= base_typeC wrap
204 (* --------------------------------------------------------------------- *)
205 (* Variable declaration *)
206 (* Even if the Cocci program specifies a list of declarations, they are
207 split out into multiple declarations of a single variable each. *)
209 and base_declaration
=
210 MetaDecl
of Ast.meta_name mcode
* pure
(* variables *)
211 (* the following are kept separate from MetaDecls because ultimately
212 they don't match the same thin at all. Consider whether there
213 should be a separate type for fields, as in the C AST *)
214 | MetaField
of Ast.meta_name mcode
* pure
(* structure fields *)
215 | Init
of Ast.storage mcode
option * typeC
* ident
* string mcode
(*=*) *
216 initialiser
* string mcode
(*;*)
217 | UnInit
of Ast.storage mcode
option * typeC
* ident
* string mcode
(* ; *)
218 | TyDecl
of typeC
* string mcode
(* ; *)
219 | MacroDecl
of ident
(* name *) * string mcode
(* ( *) *
220 expression dots
* string mcode
(* ) *) * string mcode
(* ; *)
221 | Typedef
of string mcode
(* typedef *) * typeC
* typeC
* string mcode
(*;*)
222 | DisjDecl
of string mcode
* declaration list
*
223 string mcode list
(* the |s *) * string mcode
224 (* Ddots is for a structure declaration *)
225 | Ddots
of string mcode
(* ... *) * declaration
option (* whencode *)
226 | OptDecl
of declaration
227 | UniqueDecl
of declaration
229 and declaration
= base_declaration wrap
231 (* --------------------------------------------------------------------- *)
234 and base_initialiser
=
235 MetaInit
of Ast.meta_name mcode
* pure
236 | InitExpr
of expression
237 | InitList
of string mcode
(*{*) * initialiser_list
* string mcode
(*}*) *
238 (* true if ordered, as for array, false if unordered, as for struct *)
241 designator list
(* name *) * string mcode
(*=*) *
242 initialiser
(* gccext: *)
243 | InitGccName
of ident
(* name *) * string mcode
(*:*) *
245 | IComma
of string mcode
(* , *)
246 | Idots
of string mcode
(* ... *) * initialiser
option (* whencode *)
247 | OptIni
of initialiser
248 | UniqueIni
of initialiser
251 DesignatorField
of string mcode
(* . *) * ident
252 | DesignatorIndex
of string mcode
(* [ *) * expression
* string mcode
(* ] *)
254 string mcode
(* [ *) * expression
* string mcode
(* ... *) *
255 expression
* string mcode
(* ] *)
257 and initialiser
= base_initialiser wrap
259 and initialiser_list
= initialiser dots
261 (* --------------------------------------------------------------------- *)
264 and base_parameterTypeDef
=
266 | Param
of typeC
* ident
option
267 | MetaParam
of Ast.meta_name mcode
* pure
268 | MetaParamList
of Ast.meta_name mcode
* listlen
* pure
269 | PComma
of string mcode
270 | Pdots
of string mcode
(* ... *)
271 | Pcircles
of string mcode
(* ooo *)
272 | OptParam
of parameterTypeDef
273 | UniqueParam
of parameterTypeDef
275 and parameterTypeDef
= base_parameterTypeDef wrap
277 and parameter_list
= parameterTypeDef dots
279 (* --------------------------------------------------------------------- *)
280 (* #define Parameters *)
282 and base_define_param
=
284 | DPComma
of string mcode
285 | DPdots
of string mcode
(* ... *)
286 | DPcircles
of string mcode
(* ooo *)
287 | OptDParam
of define_param
288 | UniqueDParam
of define_param
290 and define_param
= base_define_param wrap
292 and base_define_parameters
=
294 | DParams
of string mcode
(*( *) * define_param dots
* string mcode
(* )*)
296 and define_parameters
= base_define_parameters wrap
298 (* --------------------------------------------------------------------- *)
302 Decl
of (info
* mcodekind
) (* before the decl *) * declaration
303 | Seq
of string mcode
(* { *) * statement dots
*
305 | ExprStatement
of expression
* string mcode
(*;*)
306 | IfThen
of string mcode
(* if *) * string mcode
(* ( *) *
307 expression
* string mcode
(* ) *) *
308 statement
* (info
* mcodekind
) (* after info *)
309 | IfThenElse
of string mcode
(* if *) * string mcode
(* ( *) *
310 expression
* string mcode
(* ) *) *
311 statement
* string mcode
(* else *) * statement
*
313 | While
of string mcode
(* while *) * string mcode
(* ( *) *
314 expression
* string mcode
(* ) *) *
315 statement
* (info
* mcodekind
) (* after info *)
316 | Do
of string mcode
(* do *) * statement
*
317 string mcode
(* while *) * string mcode
(* ( *) *
318 expression
* string mcode
(* ) *) *
320 | For
of string mcode
(* for *) * string mcode
(* ( *) *
321 expression
option * string mcode
(*;*) *
322 expression
option * string mcode
(*;*) *
323 expression
option * string mcode
(* ) *) * statement
*
324 (info
* mcodekind
) (* after info *)
325 | Iterator
of ident
(* name *) * string mcode
(* ( *) *
326 expression dots
* string mcode
(* ) *) *
327 statement
* (info
* mcodekind
) (* after info *)
328 | Switch
of string mcode
(* switch *) * string mcode
(* ( *) *
329 expression
* string mcode
(* ) *) * string mcode
(* { *) *
330 statement
(*decl*) dots
*
331 case_line dots
* string mcode
(* } *)
332 | Break
of string mcode
(* break *) * string mcode
(* ; *)
333 | Continue
of string mcode
(* continue *) * string mcode
(* ; *)
334 | Label
of ident
* string mcode
(* : *)
335 | Goto
of string mcode
(* goto *) * ident
* string mcode
(* ; *)
336 | Return
of string mcode
(* return *) * string mcode
(* ; *)
337 | ReturnExpr
of string mcode
(* return *) * expression
*
339 | MetaStmt
of Ast.meta_name mcode
* pure
340 | MetaStmtList
of Ast.meta_name mcode
(*only in statement lists*) * pure
341 | Exp
of expression
(* only in dotted statement lists *)
342 | TopExp
of expression
(* for macros body *)
343 | Ty
of typeC
(* only at top level *)
344 | TopInit
of initialiser
(* only at top level *)
345 | Disj
of string mcode
* statement dots list
*
346 string mcode list
(* the |s *) * string mcode
347 | Nest
of string mcode
* statement dots
* string mcode
*
348 (statement dots
,statement
) whencode list
* Ast.multi
349 | Dots
of string mcode
(* ... *) *
350 (statement dots
,statement
) whencode list
351 | Circles
of string mcode
(* ooo *) *
352 (statement dots
,statement
) whencode list
353 | Stars
of string mcode
(* *** *) *
354 (statement dots
,statement
) whencode list
355 | FunDecl
of (info
* mcodekind
) (* before the function decl *) *
356 fninfo list
* ident
(* name *) *
357 string mcode
(* ( *) * parameter_list
* string mcode
(* ) *) *
358 string mcode
(* { *) * statement dots
*
360 | Include
of string mcode
(* #include *) * Ast.inc_file mcode
(* file *)
361 | Define
of string mcode
(* #define *) * ident
(* name *) *
362 define_parameters
(*params*) * statement dots
363 | OptStm
of statement
364 | UniqueStm
of statement
367 FStorage
of Ast.storage mcode
369 | FInline
of string mcode
370 | FAttr
of string mcode
372 and ('a
,'b
) whencode
=
375 | WhenModifier
of Ast.when_modifier
376 | WhenNotTrue
of expression
377 | WhenNotFalse
of expression
379 and statement
= base_statement wrap
382 Default
of string mcode
(* default *) * string mcode
(*:*) * statement dots
383 | Case
of string mcode
(* case *) * expression
* string mcode
(*:*) *
385 | DisjCase
of string mcode
* case_line list
*
386 string mcode list
(* the |s *) * string mcode
387 | OptCase
of case_line
389 and case_line
= base_case_line wrap
391 (* --------------------------------------------------------------------- *)
395 MetaPos
of Ast.meta_name mcode
* Ast.meta_name list
* Ast.meta_collect
398 (* --------------------------------------------------------------------- *)
403 | CODE
of statement dots
404 | FILEINFO
of string mcode
(* old file *) * string mcode
(* new file *)
405 | ERRORWORDS
of expression list
406 | OTHER
of statement
(* temporary, disappears after top_level.ml *)
408 and top_level
= base_top_level wrap
409 and rule
= top_level list
413 (rule
* Ast.metavar list
*
414 (string list
* string list
* Ast.dependency
* string * Ast.exists
)) *
415 (rule
* Ast.metavar list
) * Ast.ruletype
416 | ScriptRule
of string (* name *) *
417 string * Ast.dependency
*
418 (Ast.script_meta_name
* Ast.meta_name
* Ast.metavar
) list
*
419 Ast.meta_name list
(*script vars*) *
421 | InitialScriptRule
of string (* name *) *string * Ast.dependency
* string
422 | FinalScriptRule
of string (* name *) *string * Ast.dependency
* string
424 (* --------------------------------------------------------------------- *)
427 DotsExprTag
of expression dots
428 | DotsInitTag
of initialiser dots
429 | DotsParamTag
of parameterTypeDef dots
430 | DotsStmtTag
of statement dots
431 | DotsDeclTag
of declaration dots
432 | DotsCaseTag
of case_line dots
434 | ExprTag
of expression
435 | ArgExprTag
of expression
(* for isos *)
436 | TestExprTag
of expression
(* for isos *)
438 | ParamTag
of parameterTypeDef
439 | InitTag
of initialiser
440 | DeclTag
of declaration
441 | StmtTag
of statement
442 | CaseLineTag
of case_line
443 | TopTag
of top_level
444 | IsoWhenTag
of Ast.when_modifier
445 | IsoWhenTTag
of expression
446 | IsoWhenFTag
of expression
447 | MetaPosTag
of meta_pos
449 let dotsExpr x
= DotsExprTag x
450 let dotsParam x
= DotsParamTag x
451 let dotsInit x
= DotsInitTag x
452 let dotsStmt x
= DotsStmtTag x
453 let dotsDecl x
= DotsDeclTag x
454 let dotsCase x
= DotsCaseTag x
455 let ident x
= IdentTag x
456 let expr x
= ExprTag x
457 let typeC x
= TypeCTag x
458 let param x
= ParamTag x
459 let ini x
= InitTag x
460 let decl x
= DeclTag x
461 let stmt x
= StmtTag x
462 let case_line x
= CaseLineTag x
465 (* --------------------------------------------------------------------- *)
466 (* Avoid cluttering the parser. Calculated in compute_lines.ml. *)
469 { line_start
= -1; line_end
= -1;
470 logical_start
= -1; logical_end
= -1;
471 column
= -1; offset
= -1; }
473 let default_info _
= (* why is this a function? *)
474 { pos_info = pos_info;
475 attachable_start
= true; attachable_end
= true;
476 mcode_start
= []; mcode_end
= [];
477 strings_before
= []; strings_after
= [] }
479 let default_befaft _
=
480 MIXED
(ref (Ast.NOTHING
,default_token_info,default_token_info))
481 let context_befaft _
=
482 CONTEXT
(ref (Ast.NOTHING
,default_token_info,default_token_info))
483 let minus_befaft _
= MINUS
(ref ([],default_token_info))
487 info
= default_info();
489 mcodekind
= ref (default_befaft());
493 true_if_test
= false;
494 true_if_test_exp
= false;
498 info
= default_info();
500 mcodekind
= ref (context_befaft());
504 true_if_test
= false;
505 true_if_test_exp
= false;
507 let unwrap x
= x
.node
508 let unwrap_mcode (x
,_
,_
,_
,_
,_
) = x
509 let rewrap model x
= { model
with node
= x
}
510 let rewrap_mcode (_
,arity
,info
,mcodekind
,pos
,adj
) x
=
511 (x
,arity
,info
,mcodekind
,pos
,adj
)
512 let copywrap model x
=
513 { model
with node
= x
; index
= ref !(model
.index
);
514 mcodekind
= ref !(model
.mcodekind
); exp_ty
= ref !(model
.exp_ty
)}
515 let get_pos (_
,_
,_
,_
,x
,_
) = !x
516 let get_pos_ref (_
,_
,_
,_
,x
,_
) = x
517 let set_pos pos
(m
,arity
,info
,mcodekind
,_
,adj
) =
518 (m
,arity
,info
,mcodekind
,ref pos
,adj
)
519 let get_info x
= x
.info
520 let set_info x info
= {x
with info
= info
}
521 let get_line x
= x
.info
.pos_info.line_start
522 let get_line_end x
= x
.info
.pos_info.line_end
523 let get_index x
= !(x
.index
)
524 let set_index x i
= x
.index
:= i
525 let get_mcodekind x
= !(x
.mcodekind
)
526 let get_mcode_mcodekind (_
,_
,_
,mcodekind
,_
,_
) = mcodekind
527 let get_mcodekind_ref x
= x
.mcodekind
528 let set_mcodekind x mk
= x
.mcodekind
:= mk
529 let set_type x t
= x
.exp_ty
:= t
530 let get_type x
= !(x
.exp_ty
)
531 let get_dots_bef_aft x
= x
.bef_aft
532 let set_dots_bef_aft x dots_bef_aft
= {x
with bef_aft
= dots_bef_aft
}
533 let get_arg_exp x
= x
.true_if_arg
534 let set_arg_exp x
= {x
with true_if_arg
= true}
535 let get_test_pos x
= x
.true_if_test
536 let set_test_pos x
= {x
with true_if_test
= true}
537 let get_test_exp x
= x
.true_if_test_exp
538 let set_test_exp x
= {x
with true_if_test_exp
= true}
539 let get_iso x
= x
.iso_info
540 let set_iso x i
= if !Flag.track_iso_usage
then {x
with iso_info
= i
} else x
541 let set_mcode_data data
(_
,ar
,info
,mc
,pos
,adj
) = (data
,ar
,info
,mc
,pos
,adj
)
543 (* --------------------------------------------------------------------- *)
545 (* unique indices, for mcode and tree nodes *)
546 let index_counter = ref 0
547 let fresh_index _
= let cur = !index_counter in index_counter := cur + 1; cur
549 (* --------------------------------------------------------------------- *)
557 (* --------------------------------------------------------------------- *)
559 let rec ast0_type_to_type ty
=
561 ConstVol
(cv
,ty
) -> TC.ConstVol
(const_vol cv
,ast0_type_to_type ty
)
562 | BaseType
(bty
,strings
) ->
563 TC.BaseType
(baseType bty
)
564 | Signed
(sgn
,None
) ->
565 TC.SignedT
(sign sgn
,None
)
566 | Signed
(sgn
,Some ty
) ->
567 let bty = ast0_type_to_type ty
in
568 TC.SignedT
(sign sgn
,Some
bty)
569 | Pointer
(ty
,_
) -> TC.Pointer
(ast0_type_to_type ty
)
570 | FunctionPointer
(ty
,_
,_
,_
,_
,params
,_
) ->
571 TC.FunctionPointer
(ast0_type_to_type ty
)
572 | FunctionType _
-> failwith
"not supported"
573 | Array
(ety
,_
,_
,_
) -> TC.Array
(ast0_type_to_type ety
)
574 | EnumName
(su
,Some tag
) ->
575 (match unwrap tag
with
577 TC.EnumName
(TC.Name
(unwrap_mcode tag
))
580 "warning: enum with a metavariable name detected.\n";
582 "For type checking assuming the name of the metavariable is the name of the type\n";
583 TC.EnumName
(TC.MV
(unwrap_mcode tag
,TC.Unitary
,false)))
584 | _
-> failwith
"unexpected enum type name")
585 | EnumName
(su
,None
) -> failwith
"nameless enum - what to do???"
586 | EnumDef
(ty
,_
,_
,_
) -> ast0_type_to_type ty
587 | StructUnionName
(su
,Some tag
) ->
588 (match unwrap tag
with
590 TC.StructUnionName
(structUnion su
,TC.Name
(unwrap_mcode tag
))
591 | MetaId
(tag
,Ast.IdNoConstraint
,_
) ->
593 "warning: struct/union with a metavariable name detected.\n";
595 "For type checking assuming the name of the metavariable is the name of the type\n";
596 TC.StructUnionName
(structUnion su
,
597 TC.MV
(unwrap_mcode tag
,TC.Unitary
,false)))
599 (* would have to duplicate the type in type_cocci.ml?
600 perhaps polymorphism would help? *)
601 failwith
"constraints not supported on struct type name"
602 | _
-> failwith
"unexpected struct/union type name")
603 | StructUnionName
(su
,None
) -> failwith
"nameless structure - what to do???"
604 | StructUnionDef
(ty
,_
,_
,_
) -> ast0_type_to_type ty
605 | TypeName
(name
) -> TC.TypeName
(unwrap_mcode name
)
606 | MetaType
(name
,_
) ->
607 TC.MetaType
(unwrap_mcode name
,TC.Unitary
,false)
608 | DisjType
(_
,types
,_
,_
) ->
610 "disjtype not supported in smpl type inference, assuming unknown";
612 | OptType
(ty
) | UniqueType
(ty
) ->
615 and baseType
= function
616 Ast.VoidType
-> TC.VoidType
617 | Ast.CharType
-> TC.CharType
618 | Ast.ShortType
-> TC.ShortType
619 | Ast.IntType
-> TC.IntType
620 | Ast.DoubleType
-> TC.DoubleType
621 | Ast.FloatType
-> TC.FloatType
622 | Ast.LongType
-> TC.LongType
623 | Ast.LongLongType
-> TC.LongLongType
624 | Ast.SizeType
-> TC.SizeType
625 | Ast.SSizeType
-> TC.SSizeType
626 | Ast.PtrDiffType
-> TC.PtrDiffType
629 match unwrap_mcode t
with
630 Ast.Struct
-> TC.Struct
631 | Ast.Union
-> TC.Union
634 match unwrap_mcode t
with
635 Ast.Signed
-> TC.Signed
636 | Ast.Unsigned
-> TC.Unsigned
639 match unwrap_mcode t
with
640 Ast.Const
-> TC.Const
641 | Ast.Volatile
-> TC.Volatile
643 (* --------------------------------------------------------------------- *)
644 (* this function is a rather minimal attempt. the problem is that information
645 has been lost. but since it is only used for metavariable types in the isos,
646 perhaps it doesn't matter *)
647 and make_mcode x
= (x
,NONE
,default_info(),context_befaft(),ref NoMetaPos
,-1)
648 let make_mcode_info x info
= (x
,NONE
,info
,context_befaft(),ref NoMetaPos
,-1)
649 and make_minus_mcode x
=
650 (x
,NONE
,default_info(),minus_befaft(),ref NoMetaPos
,-1)
654 let rec reverse_type ty
=
656 TC.ConstVol
(cv
,ty
) ->
657 ConstVol
(reverse_const_vol cv
,context_wrap(reverse_type ty
))
658 | TC.BaseType
(bty) ->
659 BaseType
(reverse_baseType
bty,[(* not used *)])
660 | TC.SignedT
(sgn
,None
) -> Signed
(reverse_sign sgn
,None
)
661 | TC.SignedT
(sgn
,Some
bty) ->
662 Signed
(reverse_sign sgn
,Some
(context_wrap(reverse_type ty
)))
664 Pointer
(context_wrap(reverse_type ty
),make_mcode
"*")
665 | TC.EnumName
(TC.MV
(name
,_
,_
)) ->
668 Some
(context_wrap(MetaId
(make_mcode name
,Ast.IdNoConstraint
,
670 | TC.EnumName
(TC.Name tag
) ->
671 EnumName
(make_mcode
"enum",Some
(context_wrap(Id
(make_mcode tag
))))
672 | TC.StructUnionName
(su
,TC.MV
(name
,_
,_
)) ->
675 (reverse_structUnion su
,
676 Some
(context_wrap(MetaId
(make_mcode name
,Ast.IdNoConstraint
,
677 Impure
(*not really right*)))))
678 | TC.StructUnionName
(su
,TC.Name tag
) ->
680 (reverse_structUnion su
,
681 Some
(context_wrap(Id
(make_mcode tag
))))
682 | TC.TypeName
(name
) -> TypeName
(make_mcode name
)
683 | TC.MetaType
(name
,_
,_
) ->
684 MetaType
(make_mcode name
,Impure
(*not really right*))
687 and reverse_baseType
= function
688 TC.VoidType
-> Ast.VoidType
689 | TC.CharType
-> Ast.CharType
690 | TC.BoolType
-> Ast.IntType
691 | TC.ShortType
-> Ast.ShortType
692 | TC.IntType
-> Ast.IntType
693 | TC.DoubleType
-> Ast.DoubleType
694 | TC.FloatType
-> Ast.FloatType
695 | TC.LongType
-> Ast.LongType
696 | TC.LongLongType
-> Ast.LongLongType
697 | TC.SizeType
-> Ast.SizeType
698 | TC.SSizeType
-> Ast.SSizeType
699 | TC.PtrDiffType
-> Ast.PtrDiffType
702 and reverse_structUnion t
=
705 TC.Struct
-> Ast.Struct
706 | TC.Union
-> Ast.Union
)
711 TC.Signed
-> Ast.Signed
712 | TC.Unsigned
-> Ast.Unsigned
)
714 and reverse_const_vol t
=
717 TC.Const
-> Ast.Const
718 | TC.Volatile
-> Ast.Volatile
)
720 (* --------------------------------------------------------------------- *)
724 (Impure
,_
) | (_
,Impure
) -> Impure
725 | (Pure
,Context
) | (Context
,Pure
) -> Impure
726 | (Pure
,_
) | (_
,Pure
) -> Pure
727 | (_
,Context
) | (Context
,_
) -> Context
730 (* --------------------------------------------------------------------- *)
732 let rule_name = ref "" (* for the convenience of the parser *)