diff options
Diffstat (limited to 'psl/psl-nfas.adb')
-rw-r--r-- | psl/psl-nfas.adb | 529 |
1 files changed, 0 insertions, 529 deletions
diff --git a/psl/psl-nfas.adb b/psl/psl-nfas.adb deleted file mode 100644 index da4866e53..000000000 --- a/psl/psl-nfas.adb +++ /dev/null @@ -1,529 +0,0 @@ -with GNAT.Table; - -package body PSL.NFAs is - -- Record that describes an NFA. - type NFA_Node is record - -- Chain of States. - First_State : NFA_State; - Last_State : NFA_State; - - -- Start and final state. - Start : NFA_State; - Final : NFA_State; - - -- If true there is an epsilon transition between the start and - -- the final state. - Epsilon : Boolean; - end record; - - -- Record that describe a node. - type NFA_State_Node is record - -- States may be numbered. - Label : Int32; - - -- Edges. - First_Src : NFA_Edge; - First_Dst : NFA_Edge; - - -- State links. - Next_State : NFA_State; - Prev_State : NFA_State; - - -- User fields. - User_Link : NFA_State; - User_Flag : Boolean; - end record; - - -- Record that describe an edge between SRC and DEST. - type NFA_Edge_Node is record - Dest : NFA_State; - Src : NFA_State; - Expr : Node; - - -- Links. - Next_Src : NFA_Edge; - Next_Dst : NFA_Edge; - end record; - - -- Table of NFA. - package Nfat is new GNAT.Table - (Table_Component_Type => NFA_Node, - Table_Index_Type => NFA, - Table_Low_Bound => 1, - Table_Initial => 128, - Table_Increment => 100); - - -- List of free nodes. - Free_Nfas : NFA := No_NFA; - - -- Table of States. - package Statet is new GNAT.Table - (Table_Component_Type => NFA_State_Node, - Table_Index_Type => NFA_State, - Table_Low_Bound => 1, - Table_Initial => 128, - Table_Increment => 100); - - -- List of free states. - Free_States : NFA_State := No_State; - - -- Table of edges. - package Transt is new GNAT.Table - (Table_Component_Type => NFA_Edge_Node, - Table_Index_Type => NFA_Edge, - Table_Low_Bound => 1, - Table_Initial => 128, - Table_Increment => 100); - - -- List of free edges. - Free_Edges : NFA_Edge := No_Edge; - - function Get_First_State (N : NFA) return NFA_State is - begin - return Nfat.Table (N).First_State; - end Get_First_State; - - function Get_Last_State (N : NFA) return NFA_State is - begin - return Nfat.Table (N).Last_State; - end Get_Last_State; - - procedure Set_First_State (N : NFA; S : NFA_State) is - begin - Nfat.Table (N).First_State := S; - end Set_First_State; - - procedure Set_Last_State (N : NFA; S : NFA_State) is - begin - Nfat.Table (N).Last_State := S; - end Set_Last_State; - - function Get_Next_State (S : NFA_State) return NFA_State is - begin - return Statet.Table (S).Next_State; - end Get_Next_State; - - procedure Set_Next_State (S : NFA_State; N : NFA_State) is - begin - Statet.Table (S).Next_State := N; - end Set_Next_State; - - function Get_Prev_State (S : NFA_State) return NFA_State is - begin - return Statet.Table (S).Prev_State; - end Get_Prev_State; - - procedure Set_Prev_State (S : NFA_State; N : NFA_State) is - begin - Statet.Table (S).Prev_State := N; - end Set_Prev_State; - - function Get_State_Label (S : NFA_State) return Int32 is - begin - return Statet.Table (S).Label; - end Get_State_Label; - - procedure Set_State_Label (S : NFA_State; Label : Int32) is - begin - Statet.Table (S).Label := Label; - end Set_State_Label; - - function Get_Epsilon_NFA (N : NFA) return Boolean is - begin - return Nfat.Table (N).Epsilon; - end Get_Epsilon_NFA; - - procedure Set_Epsilon_NFA (N : NFA; Flag : Boolean) is - begin - Nfat.Table (N).Epsilon := Flag; - end Set_Epsilon_NFA; - - function Add_State (N : NFA) return NFA_State is - Res : NFA_State; - Last : NFA_State; - begin - -- Get a new state. - if Free_States = No_State then - Statet.Increment_Last; - Res := Statet.Last; - else - Res := Free_States; - Free_States := Get_Next_State (Res); - end if; - - -- Put it in N. - Last := Get_Last_State (N); - Statet.Table (Res) := (Label => 0, - First_Src => No_Edge, - First_Dst => No_Edge, - Next_State => No_State, - Prev_State => Last, - User_Link => No_State, - User_Flag => False); - if Last = No_State then - Nfat.Table (N).First_State := Res; - else - Statet.Table (Last).Next_State := Res; - end if; - Nfat.Table (N).Last_State := Res; - return Res; - end Add_State; - - procedure Delete_Detached_State (S : NFA_State) is - begin - -- Put it in front of the free_states list. - Set_Next_State (S, Free_States); - Free_States := S; - end Delete_Detached_State; - - function Create_NFA return NFA - is - Res : NFA; - begin - -- Allocate a node. - if Free_Nfas = No_NFA then - Nfat.Increment_Last; - Res := Nfat.Last; - else - Res := Free_Nfas; - Free_Nfas := NFA (Get_First_State (Res)); - end if; - - -- Fill it. - Nfat.Table (Res) := (First_State => No_State, - Last_State => No_State, - Start => No_State, Final => No_State, - Epsilon => False); - return Res; - end Create_NFA; - - procedure Set_First_Src_Edge (N : NFA_State; T : NFA_Edge) is - begin - Statet.Table (N).First_Src := T; - end Set_First_Src_Edge; - - function Get_First_Src_Edge (N : NFA_State) return NFA_Edge is - begin - return Statet.Table (N).First_Src; - end Get_First_Src_Edge; - - procedure Set_First_Dest_Edge (N : NFA_State; T : NFA_Edge) is - begin - Statet.Table (N).First_Dst := T; - end Set_First_Dest_Edge; - - function Get_First_Dest_Edge (N : NFA_State) return NFA_Edge is - begin - return Statet.Table (N).First_Dst; - end Get_First_Dest_Edge; - - function Get_State_Flag (S : NFA_State) return Boolean is - begin - return Statet.Table (S).User_Flag; - end Get_State_Flag; - - procedure Set_State_Flag (S : NFA_State; Val : Boolean) is - begin - Statet.Table (S).User_Flag := Val; - end Set_State_Flag; - - function Get_State_User_Link (S : NFA_State) return NFA_State is - begin - return Statet.Table (S).User_Link; - end Get_State_User_Link; - - procedure Set_State_User_Link (S : NFA_State; Link : NFA_State) is - begin - Statet.Table (S).User_Link := Link; - end Set_State_User_Link; - - function Add_Edge (Src : NFA_State; Dest : NFA_State; Expr : Node) - return NFA_Edge - is - Res : NFA_Edge; - begin - -- Allocate a note. - if Free_Edges /= No_Edge then - Res := Free_Edges; - Free_Edges := Get_Next_Dest_Edge (Res); - else - Transt.Increment_Last; - Res := Transt.Last; - end if; - - -- Initialize it. - Transt.Table (Res) := (Dest => Dest, - Src => Src, - Expr => Expr, - Next_Src => Get_First_Src_Edge (Src), - Next_Dst => Get_First_Dest_Edge (Dest)); - Set_First_Src_Edge (Src, Res); - Set_First_Dest_Edge (Dest, Res); - return Res; - end Add_Edge; - - procedure Add_Edge (Src : NFA_State; Dest : NFA_State; Expr : Node) is - Res : NFA_Edge; - pragma Unreferenced (Res); - begin - Res := Add_Edge (Src, Dest, Expr); - end Add_Edge; - - procedure Delete_Empty_NFA (N : NFA) is - begin - pragma Assert (Get_First_State (N) = No_State); - pragma Assert (Get_Last_State (N) = No_State); - - -- Put it in front of the free_nfas list. - Set_First_State (N, NFA_State (Free_Nfas)); - Free_Nfas := N; - end Delete_Empty_NFA; - - function Get_Start_State (N : NFA) return NFA_State is - begin - return Nfat.Table (N).Start; - end Get_Start_State; - - procedure Set_Start_State (N : NFA; S : NFA_State) is - begin - Nfat.Table (N).Start := S; - end Set_Start_State; - - function Get_Final_State (N : NFA) return NFA_State is - begin - return Nfat.Table (N).Final; - end Get_Final_State; - - procedure Set_Final_State (N : NFA; S : NFA_State) is - begin - Nfat.Table (N).Final := S; - end Set_Final_State; - - function Get_Next_Src_Edge (N : NFA_Edge) return NFA_Edge is - begin - return Transt.Table (N).Next_Src; - end Get_Next_Src_Edge; - - procedure Set_Next_Src_Edge (E : NFA_Edge; N_E : NFA_Edge) is - begin - Transt.Table (E).Next_Src := N_E; - end Set_Next_Src_Edge; - - function Get_Next_Dest_Edge (N : NFA_Edge) return NFA_Edge is - begin - return Transt.Table (N).Next_Dst; - end Get_Next_Dest_Edge; - - procedure Set_Next_Dest_Edge (E : NFA_Edge; N_E : NFA_Edge) is - begin - Transt.Table (E).Next_Dst := N_E; - end Set_Next_Dest_Edge; - - function Get_Edge_Dest (E : NFA_Edge) return NFA_State is - begin - return Transt.Table (E).Dest; - end Get_Edge_Dest; - - procedure Set_Edge_Dest (E : NFA_Edge; D : NFA_State) is - begin - Transt.Table (E).Dest := D; - end Set_Edge_Dest; - - function Get_Edge_Src (E : NFA_Edge) return NFA_State is - begin - return Transt.Table (E).Src; - end Get_Edge_Src; - - procedure Set_Edge_Src (E : NFA_Edge; D : NFA_State) is - begin - Transt.Table (E).Src := D; - end Set_Edge_Src; - - function Get_Edge_Expr (E : NFA_Edge) return Node is - begin - return Transt.Table (E).Expr; - end Get_Edge_Expr; - - procedure Set_Edge_Expr (E : NFA_Edge; N : Node) is - begin - Transt.Table (E).Expr := N; - end Set_Edge_Expr; - - procedure Remove_Unconnected_State (N : NFA; S : NFA_State) is - N_S : constant NFA_State := Get_Next_State (S); - P_S : constant NFA_State := Get_Prev_State (S); - begin - pragma Assert (Get_First_Src_Edge (S) = No_Edge); - pragma Assert (Get_First_Dest_Edge (S) = No_Edge); - - if P_S = No_State then - Set_First_State (N, N_S); - else - Set_Next_State (P_S, N_S); - end if; - if N_S = No_State then - Set_Last_State (N, P_S); - else - Set_Prev_State (N_S, P_S); - end if; - Delete_Detached_State (S); - end Remove_Unconnected_State; - - procedure Merge_NFA (L, R : NFA) is - Last_L : constant NFA_State := Get_Last_State (L); - First_R : constant NFA_State := Get_First_State (R); - Last_R : constant NFA_State := Get_Last_State (R); - begin - if First_R = No_State then - return; - end if; - if Last_L = No_State then - Set_First_State (L, First_R); - else - Set_Next_State (Last_L, First_R); - Set_Prev_State (First_R, Last_L); - end if; - Set_Last_State (L, Last_R); - Set_First_State (R, No_State); - Set_Last_State (R, No_State); - Delete_Empty_NFA (R); - end Merge_NFA; - - procedure Redest_Edges (S : NFA_State; Dest : NFA_State) is - E, N_E : NFA_Edge; - Head : NFA_Edge; - begin - E := Get_First_Dest_Edge (S); - if E = No_Edge then - return; - end if; - Set_First_Dest_Edge (S, No_Edge); - Head := Get_First_Dest_Edge (Dest); - Set_First_Dest_Edge (Dest, E); - loop - N_E := Get_Next_Dest_Edge (E); - Set_Edge_Dest (E, Dest); - exit when N_E = No_Edge; - E := N_E; - end loop; - Set_Next_Dest_Edge (E, Head); - end Redest_Edges; - - procedure Resource_Edges (S : NFA_State; Src : NFA_State) is - E, N_E : NFA_Edge; - Head : NFA_Edge; - begin - E := Get_First_Src_Edge (S); - if E = No_Edge then - return; - end if; - Set_First_Src_Edge (S, No_Edge); - Head := Get_First_Src_Edge (Src); - Set_First_Src_Edge (Src, E); - loop - N_E := Get_Next_Src_Edge (E); - Set_Edge_Src (E, Src); - exit when N_E = No_Edge; - E := N_E; - end loop; - Set_Next_Src_Edge (E, Head); - end Resource_Edges; - - procedure Disconnect_Edge_Src (N : NFA_State; E : NFA_Edge) is - N_E : constant NFA_Edge := Get_Next_Src_Edge (E); - Prev, Cur : NFA_Edge; - begin - Cur := Get_First_Src_Edge (N); - if Cur = E then - Set_First_Src_Edge (N, N_E); - else - while Cur /= E loop - Prev := Cur; - Cur := Get_Next_Src_Edge (Prev); - pragma Assert (Cur /= No_Edge); - end loop; - Set_Next_Src_Edge (Prev, N_E); - end if; - end Disconnect_Edge_Src; - - procedure Disconnect_Edge_Dest (N : NFA_State; E : NFA_Edge) is - N_E : constant NFA_Edge := Get_Next_Dest_Edge (E); - Prev, Cur : NFA_Edge; - begin - Cur := Get_First_Dest_Edge (N); - if Cur = E then - Set_First_Dest_Edge (N, N_E); - else - while Cur /= E loop - Prev := Cur; - Cur := Get_Next_Dest_Edge (Prev); - pragma Assert (Cur /= No_Edge); - end loop; - Set_Next_Dest_Edge (Prev, N_E); - end if; - end Disconnect_Edge_Dest; - - procedure Remove_Edge (E : NFA_Edge) is - begin - Disconnect_Edge_Src (Get_Edge_Src (E), E); - Disconnect_Edge_Dest (Get_Edge_Dest (E), E); - - -- Put it on the free list. - Set_Next_Dest_Edge (E, Free_Edges); - Free_Edges := E; - end Remove_Edge; - - procedure Remove_State (N : NFA; S : NFA_State) is - E, N_E : NFA_Edge; - begin - E := Get_First_Dest_Edge (S); - while E /= No_Edge loop - N_E := Get_Next_Dest_Edge (E); - Remove_Edge (E); - E := N_E; - end loop; - - E := Get_First_Src_Edge (S); - while E /= No_Edge loop - N_E := Get_Next_Src_Edge (E); - Remove_Edge (E); - E := N_E; - end loop; - - Remove_Unconnected_State (N, S); - end Remove_State; - - procedure Labelize_States (N : NFA; Nbr_States : out Natural) - is - S, Start, Final : NFA_State; - begin - S := Get_First_State (N); - Start := Get_Start_State (N); - Final := Get_Final_State (N); - pragma Assert (Start /= No_State); - Set_State_Label (Start, 0); - Nbr_States := 1; - while S /= No_State loop - if S /= Start and then S /= Final then - Set_State_Label (S, Int32 (Nbr_States)); - Nbr_States := Nbr_States + 1; - end if; - S := Get_Next_State (S); - end loop; - pragma Assert (Final /= No_State); - Set_State_Label (Final, Int32 (Nbr_States)); - Nbr_States := Nbr_States + 1; - end Labelize_States; - - procedure Labelize_States_Debug (N : NFA) - is - S : NFA_State; - begin - S := Get_First_State (N); - while S /= No_State loop - Set_State_Label (S, Int32 (S)); - S := Get_Next_State (S); - end loop; - end Labelize_States_Debug; - -end PSL.NFAs; |