(****************************************************************************) (* *) (* Objective Caml *) (* *) (* INRIA Rocquencourt *) (* *) (* Copyright 2006 Institut National de Recherche en Informatique et *) (* en Automatique. All rights reserved. This file is distributed under *) (* the terms of the GNU Library General Public License, with the special *) (* exception on linking described in LICENSE at the top of the Objective *) (* Caml source tree. *) (* *) (****************************************************************************) (* Authors: * - Daniel de Rauglaudre: initial version * - Nicolas Pouillard: refactoring *) module Make (Structure : Structure.S) = struct open Structure; value tree_in_entry prev_symb tree = fun [ Dlevels levels -> let rec search_levels = fun [ [] -> tree | [level :: levels] -> match search_level level with [ Some tree -> tree | None -> search_levels levels ] ] and search_level level = match search_tree level.lsuffix with [ Some t -> Some (Node {node = Sself; son = t; brother = DeadEnd}) | None -> search_tree level.lprefix ] and search_tree t = if tree <> DeadEnd && t == tree then Some t else match t with [ Node n -> match search_symbol n.node with [ Some symb -> Some (Node {node = symb; son = n.son; brother = DeadEnd}) | None -> match search_tree n.son with [ Some t -> Some (Node {node = n.node; son = t; brother = DeadEnd}) | None -> search_tree n.brother ] ] | LocAct _ _ | DeadEnd -> None ] and search_symbol symb = match symb with [ Snterm _ | Snterml _ _ | Slist0 _ | Slist0sep _ _ | Slist1 _ | Slist1sep _ _ | Sopt _ | Stoken _ | Stree _ | Skeyword _ when symb == prev_symb -> Some symb | Slist0 symb -> match search_symbol symb with [ Some symb -> Some (Slist0 symb) | None -> None ] | Slist0sep symb sep -> match search_symbol symb with [ Some symb -> Some (Slist0sep symb sep) | None -> match search_symbol sep with [ Some sep -> Some (Slist0sep symb sep) | None -> None ] ] | Slist1 symb -> match search_symbol symb with [ Some symb -> Some (Slist1 symb) | None -> None ] | Slist1sep symb sep -> match search_symbol symb with [ Some symb -> Some (Slist1sep symb sep) | None -> match search_symbol sep with [ Some sep -> Some (Slist1sep symb sep) | None -> None ] ] | Sopt symb -> match search_symbol symb with [ Some symb -> Some (Sopt symb) | None -> None ] | Stree t -> match search_tree t with [ Some t -> Some (Stree t) | None -> None ] | _ -> None ] in search_levels levels | Dparser _ -> tree ] ; end;