ocaml/camlp4/Camlp4/Struct/Grammar/Search.ml

92 lines
3.6 KiB
OCaml
Raw Normal View History

(****************************************************************************)
(* *)
(* 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;