(*
+ * Copyright 2010, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
* Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
* Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
* This file is part of Coccinelle.
*)
-(* Constraints on Meta-* Identifiers, Functions *)
-type idconstraint =
- IdNoConstraint
- | IdNegIdSet of string list
- | IdRegExp of string * Str.regexp
- | IdNotRegExp of string * Str.regexp
-
(* --------------------------------------------------------------------- *)
(* Modified code *)
+type added_string = Noindent of string | Indent of string
+
type info = { line : int; column : int;
- strbef : (string * int (* line *) * int (* col *)) list;
- straft : (string * int (* line *) * int (* col *)) list }
+ strbef : (added_string * int (* line *) * int (* col *)) list;
+ straft : (added_string * int (* line *) * int (* col *)) list }
type line = int
type meta_name = string * string
(* need to be careful about rewrapping, to avoid duplicating pos info
| MetaInitDecl of arity * meta_name (* name *)
| MetaListlenDecl of meta_name (* name *)
| MetaParamDecl of arity * meta_name (* name *)
- | MetaParamListDecl of arity * meta_name (*name*) * meta_name option (*len*)
+ | MetaParamListDecl of arity * meta_name (*name*) * list_len (*len*)
| MetaConstDecl of
arity * meta_name (* name *) * Type_cocci.typeC list option
| MetaErrDecl of arity * meta_name (* name *)
arity * meta_name (* name *) * Type_cocci.typeC list option
| MetaLocalIdExpDecl of
arity * meta_name (* name *) * Type_cocci.typeC list option
- | MetaExpListDecl of arity * meta_name (*name*) * meta_name option (*len*)
+ | MetaExpListDecl of arity * meta_name (*name*) * list_len (*len*)
+ | MetaDeclDecl of arity * meta_name (* name *)
+ | MetaFieldDecl of arity * meta_name (* name *)
| MetaStmDecl of arity * meta_name (* name *)
| MetaStmListDecl of arity * meta_name (* name *)
| MetaFuncDecl of arity * meta_name (* name *)
| MetaDeclarerDecl of arity * meta_name (* name *)
| MetaIteratorDecl of arity * meta_name (* name *)
+and list_len = AnyLen | MetaLen of meta_name | CstLen of int
+
and seed = NoVal | StringSeed of string | ListSeed of seed_elem list
and seed_elem = SeedString of string | SeedId of meta_name
inherited
| MetaExpr of meta_name mcode * constraints * keep_binding *
Type_cocci.typeC list option * form * inherited
- | MetaExprList of meta_name mcode * listlen option * keep_binding *
+ | MetaExprList of meta_name mcode * listlen * keep_binding *
inherited (* only in arg lists *)
| EComma of string mcode (* only in arg lists *)
| DisjExpr of expression list
- | NestExpr of expression dots * expression option * multi
+ | NestExpr of string mcode (* <.../<+... *) *
+ expression dots *
+ string mcode (* ...>/...+> *) *
+ expression option * multi
(* can appear in arg lists, and also inside Nest, as in:
if(< ... X ... Y ...>)
and constraints =
NoConstraint
- | NotIdCstrt of idconstraint
+ | NotIdCstrt of reconstraint
| NotExpCstrt of expression list
+ | SubExpCstrt of meta_name list
+
+(* Constraints on Meta-* Identifiers, Functions *)
+and idconstraint =
+ IdNoConstraint
+ | IdNegIdSet of string list * meta_name list
+ | IdRegExpConstraint of reconstraint
+
+and reconstraint =
+ | IdRegExp of string * Str.regexp
+ | IdNotRegExp of string * Str.regexp
(* ANY = int E; ID = idexpression int X; CONST = constant int X; *)
and form = ANY | ID | LocalID | CONST (* form for MetaExp *)
and expression = base_expression wrap
-and listlen = meta_name mcode * keep_binding * inherited
+and listlen =
+ MetaListLen of meta_name mcode * keep_binding * inherited
+ | CstListLen of int
+ | AnyListLen
and unaryOp = GetRef | DeRef | UnPlus | UnMinus | Tilde | Not
and assignOp = SimpleAssign | OpAssign of arithOp
| Ddots of string mcode (* ... *) * declaration option (* whencode *)
| MetaDecl of meta_name mcode * keep_binding * inherited
+ | MetaField of meta_name mcode * keep_binding * inherited
| OptDecl of declaration
| UniqueDecl of declaration
and base_initialiser =
MetaInit of meta_name mcode * keep_binding * inherited
| InitExpr of expression
- | InitList of string mcode (*{*) * initialiser list * string mcode (*}*) *
+ | InitList of bool (* true if all are - *) *
+ string mcode (*{*) * initialiser list * string mcode (*}*) *
initialiser list (* whencode: elements that shouldn't appear in init *)
| InitGccExt of
designator list (* name *) * string mcode (*=*) *
| Param of fullType * ident option
| MetaParam of meta_name mcode * keep_binding * inherited
- | MetaParamList of meta_name mcode * listlen option * keep_binding *
- inherited
+ | MetaParamList of meta_name mcode * listlen * keep_binding * inherited
| PComma of string mcode
statement (*decl*) dots * case_line list * rule_elem(*}*)
| Atomic of rule_elem
| Disj of statement dots list
- | Nest of statement dots *
+ | Nest of string mcode (* <.../<+... *) * statement dots *
+ string mcode (* ...>/...+> *) *
(statement dots,statement) whencode list * multi *
dots_whencode list * dots_whencode list
| FunDecl of rule_elem (* header *) * rule_elem (* { *) *
string list * string list * exists * bool
| GeneratedRulename of string option * dependency *
string list * string list * exists * bool
- | ScriptRulename of string * dependency
- | InitialScriptRulename of string
- | FinalScriptRulename of string
+ | ScriptRulename of string option (* name *) * string (* language *) *
+ dependency
+ | InitialScriptRulename of string option (* name *) * string (* language *) *
+ dependency
+ | FinalScriptRulename of string option (* name *) * string (* language *) *
+ dependency
and ruletype = Normal | Generated
CocciRule of string (* name *) *
(dependency * string list (* dropped isos *) * exists) * top_level list
* bool list * ruletype
- | ScriptRule of string * dependency * (string * meta_name) list * string
- | InitialScriptRule of string (*language*) * string (*code*)
- | FinalScriptRule of string (*language*) * string (*code*)
+ | ScriptRule of string (* name *) *
+ (* metaname for python (untyped), metavar for ocaml (typed) *)
+ string * dependency *
+ (script_meta_name * meta_name * metavar) list (*inherited vars*) *
+ meta_name list (*script vars*) * string
+ | InitialScriptRule of string (* name *) *
+ string (*language*) * dependency * string (*code*)
+ | FinalScriptRule of string (* name *) *
+ string (*language*) * dependency * string (*code*)
+
+and script_meta_name = string option (*string*) * string option (*ast*)
and dependency =
Dep of string (* rule applies for the current binding *)
| NeverDep of string (* rule never applies for any binding *)
| AndDep of dependency * dependency
| OrDep of dependency * dependency
- | NoDep
+ | NoDep | FailDep
and rule_with_metavars = metavar list * rule
| CaseLineTag of case_line
| ConstVolTag of const_vol
| Token of string * info option
- | Pragma of string list
+ | Pragma of added_string list
| Code of top_level
| ExprDotsTag of expression dots
| ParamDotsTag of parameterTypeDef dots
| MetaIdExpDecl(ar,nm,ty) -> nm
| MetaLocalIdExpDecl(ar,nm,ty) -> nm
| MetaExpListDecl(ar,nm,nm1) -> nm
+ | MetaDeclDecl(ar,nm) -> nm
+ | MetaFieldDecl(ar,nm) -> nm
| MetaStmDecl(ar,nm) -> nm
| MetaStmListDecl(ar,nm) -> nm
| MetaFuncDecl(ar,nm) -> nm
iso_info = [] }
let make_meta_rule_elem s d (fvs,fresh,inh) =
+ let rule = "" in
{(make_term
- (MetaRuleElem((("",s),no_info,d,NoMetaPos),Type_cocci.Unitary,false)))
+ (MetaRuleElem(((rule,s),no_info,d,NoMetaPos),Type_cocci.Unitary,false)))
with free_vars = fvs; fresh_vars = fresh; inherited = inh}
let make_meta_decl s d (fvs,fresh,inh) =
+ let rule = "" in
{(make_term
- (MetaDecl((("",s),no_info,d,NoMetaPos),Type_cocci.Unitary,false))) with
+ (MetaDecl(((rule,s),no_info,d,NoMetaPos),Type_cocci.Unitary,false))) with
free_vars = fvs; fresh_vars = fresh; inherited = inh}
let make_mcode x = (x,no_info,CONTEXT(NoPos,NOTHING),NoMetaPos)