*)
-(*
- * 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.
- *
- * Coccinelle is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, according to version 2 of the License.
- *
- * Coccinelle is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Coccinelle. If not, see <http://www.gnu.org/licenses/>.
- *
- * The authors reserve the right to distribute this or future versions of
- * Coccinelle under other licenses.
- *)
-
-
(* The error message "no available token to attach to" often comes in an
argument list of unbounded length. In this case, one should move a comma so
that there is a comma after the + code. *)
l
let process_minus minus =
+ Hashtbl.clear root_token_table;
create_root_token_table minus;
List.concat
(List.map
let toplevel r k e =
match Ast0.unwrap e with
- Ast0.DECL(s) -> r.VT0.combiner_rec_statement s
+ Ast0.NONDECL(s) -> r.VT0.combiner_rec_statement s
| Ast0.CODE(sdots) -> r.VT0.combiner_rec_statement_dots sdots
| _ -> do_nothing mk_code r k e in
Ast0.left_offset = info.Ast0.pos_info.Ast0.offset;
Ast0.right_offset = info.Ast0.pos_info.Ast0.offset})
+let it2c = function Ast.ONE -> "one" | Ast.MANY -> "many"
+
let attachbefore (infop,c,p) = function
Ast0.MINUS(replacements) ->
let (repl,ti) = !replacements in
- let (bef,ti) =
- match repl with
- [] -> init p infop
- | repl -> insert p infop repl ti in
- replacements := (bef,ti)
+ (match repl with
+ Ast.NOREPLACEMENT ->
+ let (bef,ti) = init p infop in
+ replacements := (Ast.REPLACEMENT(bef,c),ti)
+ | Ast.REPLACEMENT(repl,it) ->
+ let it = Ast.lub_count it c in
+ let (bef,ti) = insert p infop repl ti in
+ replacements := (Ast.REPLACEMENT(bef,it),ti))
| Ast0.CONTEXT(neighbors) ->
let (repl,ti1,ti2) = !neighbors in
(match repl with
let attachafter (infop,c,p) = function
Ast0.MINUS(replacements) ->
let (repl,ti) = !replacements in
- let (aft,ti) =
- match repl with
- [] -> init p infop
- | repl -> insert p infop repl ti in
- replacements := (aft,ti)
+ (match repl with
+ Ast.NOREPLACEMENT ->
+ let (aft,ti) = init p infop in
+ replacements := (Ast.REPLACEMENT(aft,c),ti)
+ | Ast.REPLACEMENT(repl,it) ->
+ let it = Ast.lub_count it c in
+ let (aft,ti) = insert p infop repl ti in
+ replacements := (Ast.REPLACEMENT(aft,it),ti))
| Ast0.CONTEXT(neighbors) ->
let (repl,ti1,ti2) = !neighbors in
(match repl with
Printf.printf "minus code\n";
List.iter
(function (_,info,_) ->
- Printf.printf "start %d end %d real_start %d real_end %d\n"
+ Printf.printf
+ "start %d end %d real_start %d real_end %d attachable start %b attachable end %b\n"
info.Ast0.pos_info.Ast0.logical_start
info.Ast0.pos_info.Ast0.logical_end
info.Ast0.pos_info.Ast0.line_start
- info.Ast0.pos_info.Ast0.line_end)
+ info.Ast0.pos_info.Ast0.line_end
+ info.Ast0.attachable_start
+ info.Ast0.attachable_end)
m;
Printf.printf "plus code\n";
List.iter