1 (****************************************************************************)
5 (* INRIA Rocquencourt *)
7 (* Copyright 2006 Institut National de Recherche en Informatique et *)
8 (* en Automatique. All rights reserved. This file is distributed under *)
9 (* the terms of the GNU Library General Public License, with the special *)
10 (* exception on linking described in LICENSE at the top of the Objective *)
11 (* Caml source tree. *)
13 (****************************************************************************)
16 * - Daniel de Rauglaudre: initial version
17 * - Nicolas Pouillard: refactoring
20 module Make (Structure : Structure.S) = struct
21 module Tools = Tools.Make Structure;
22 module Parser = Parser.Make Structure;
27 (* [delete_rule_in_tree] returns
28 [Some (dsl, t)] if success
30 Some (list of deleted nodes) if branch deleted
31 None if action replaced by previous version of action
35 value delete_rule_in_tree entry =
36 let rec delete_in_tree symbols tree =
37 match (symbols, tree) with
38 [ ([s :: sl], Node n) ->
39 if Tools.logically_eq_symbols entry s n.node then delete_son sl n
41 match delete_in_tree symbols n.brother with
43 Some (dsl, Node {node = n.node; son = n.son; brother = t})
45 | ([_ :: _], _) -> None
47 match delete_in_tree [] n.brother with
49 Some (dsl, Node {node = n.node; son = n.son; brother = t})
51 | ([], DeadEnd) -> None
52 | ([], LocAct _ []) -> Some (Some [], DeadEnd)
53 | ([], LocAct _ [action :: list]) -> Some (None, LocAct action list) ]
55 match delete_in_tree sl n.son with
56 [ Some (Some dsl, DeadEnd) -> Some (Some [n.node :: dsl], n.brother)
57 | Some (Some dsl, t) ->
58 let t = Node {node = n.node; son = t; brother = n.brother} in
59 Some (Some [n.node :: dsl], t)
61 let t = Node {node = n.node; son = t; brother = n.brother} in
67 value rec decr_keyw_use gram =
69 [ Skeyword kwd -> removing gram kwd
70 | Smeta _ sl _ -> List.iter (decr_keyw_use gram) sl
71 | Slist0 s -> decr_keyw_use gram s
72 | Slist1 s -> decr_keyw_use gram s
73 | Slist0sep s1 s2 -> do { decr_keyw_use gram s1; decr_keyw_use gram s2 }
74 | Slist1sep s1 s2 -> do { decr_keyw_use gram s1; decr_keyw_use gram s2 }
75 | Sopt s -> decr_keyw_use gram s
76 | Stree t -> decr_keyw_use_in_tree gram t
77 | Sself | Snext | Snterm _ | Snterml _ _ | Stoken _ -> () ]
78 and decr_keyw_use_in_tree gram =
80 [ DeadEnd | LocAct _ _ -> ()
83 decr_keyw_use gram n.node;
84 decr_keyw_use_in_tree gram n.son;
85 decr_keyw_use_in_tree gram n.brother
88 value rec delete_rule_in_suffix entry symbols =
91 match delete_rule_in_tree entry symbols lev.lsuffix with
95 [ Some dsl -> List.iter (decr_keyw_use entry.egram) dsl
98 [ DeadEnd when lev.lprefix == DeadEnd -> levs
101 {assoc = lev.assoc; lname = lev.lname; lsuffix = t;
102 lprefix = lev.lprefix}
107 let levs = delete_rule_in_suffix entry symbols levs in
109 | [] -> raise Not_found ]
112 value rec delete_rule_in_prefix entry symbols =
115 match delete_rule_in_tree entry symbols lev.lprefix with
119 [ Some dsl -> List.iter (decr_keyw_use entry.egram) dsl
122 [ DeadEnd when lev.lsuffix == DeadEnd -> levs
125 {assoc = lev.assoc; lname = lev.lname;
126 lsuffix = lev.lsuffix; lprefix = t}
131 let levs = delete_rule_in_prefix entry symbols levs in
133 | [] -> raise Not_found ]
136 value rec delete_rule_in_level_list entry symbols levs =
138 [ [Sself :: symbols] -> delete_rule_in_suffix entry symbols levs
139 | [Snterm e :: symbols] when e == entry ->
140 delete_rule_in_suffix entry symbols levs
141 | _ -> delete_rule_in_prefix entry symbols levs ]
145 value delete_rule entry sl =
146 match entry.edesc with
148 let levs = delete_rule_in_level_list entry sl levs in
150 entry.edesc := Dlevels levs;
153 let f = Parser.start_parser_of_entry entry in
154 do { entry.estart := f; f lev c strm };
156 fun lev bp a c strm ->
157 let f = Parser.continue_parser_of_entry entry in
158 do { entry.econtinue := f; f lev bp a c strm }