92 lines
3.6 KiB
OCaml
92 lines
3.6 KiB
OCaml
(****************************************************************************)
|
|
(* *)
|
|
(* 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;
|