]> matita.cs.unibo.it Git - helm.git/blob - helm/software/lambda-delta/automath/autProcess.ml
Additional contribs.
[helm.git] / helm / software / lambda-delta / automath / autProcess.ml
1 (*
2     ||M||  This file is part of HELM, an Hypertextual, Electronic        
3     ||A||  Library of Mathematics, developed at the Computer Science     
4     ||T||  Department, University of Bologna, Italy.                     
5     ||I||                                                                
6     ||T||  HELM is free software; you can redistribute it and/or         
7     ||A||  modify it under the terms of the GNU General Public License   
8     \   /  version 2 or (at your option) any later version.              
9      \ /   This software is distributed as is, NO WARRANTY.              
10       V_______________________________________________________________ *)
11
12 module A = Aut
13
14 type status = {
15    opening  : bool; (* just opened section *)
16    reopening: bool; (* just reopened section *)
17    closing  : bool; (* just closed section *)
18    explicit : bool; (* just found explicit context *)
19    block    : bool; (* just found block opener *)
20    iao      : int;  (* implicit context after opening section *)
21    iar      : int;  (* implicit context after reopening section *)
22    iac      : int;  (* implicit context after closing section *)
23    iag      : int   (* implicit context after global statement *)
24 }
25
26 (* internal functions *******************************************************)
27
28 let orc_reset f st =
29    f {st with opening = false; reopening = false; closing = false}
30
31 let orc_count f st =
32    let st = if st.opening then {st with iao = succ st.iao} else st in
33    let st = if st.reopening then {st with iar = succ st.iar} else st in
34    let st = if st.closing then {st with iac = succ st.iac} else st in
35    f st
36
37 let exp_count f st =
38    let st = 
39       if st.explicit || st.block then st else {st with iag = succ st.iag} 
40    in
41    f st
42
43 let proc_section f st = function
44    | Some (true, _)  -> f {st with opening = true} 
45    | Some (false, _) -> f {st with reopening = true} 
46    | None            -> f {st with closing = true}
47
48 let proc_context f st =
49    orc_reset f {st with explicit = true}
50
51 let proc_block f st =
52    orc_count (orc_reset f) {st with explicit = false; block = true}
53
54 let proc_global f st =
55    let f st = 
56       orc_count (orc_reset f) {st with explicit = false; block = false}
57    in
58    exp_count f st
59
60 let proc_entity f st entity = match entity with
61    | A.Section section -> proc_section f st section entity
62    | A.Context _       -> proc_context f st entity  
63    | A.Block _         -> proc_block f st entity
64    | A.Decl _          -> proc_global f st entity
65    | A.Def _           -> proc_global f st entity
66    
67 (* interface functions ******************************************************)
68
69 let initial_status = {
70    opening = false; reopening = false; closing = false; 
71    explicit = false; block = false;
72    iao = 0; iar = 0; iac = 0; iag = 0
73 }
74
75 let process_entity = proc_entity
76
77 let get_counters f st = f st.iao st.iar st.iac st.iag