From 01862116fefc0fb241beca2fb5402195dc933f7e Mon Sep 17 00:00:00 2001 From: Jed Barber Date: Sat, 5 Dec 2020 00:28:15 +1100 Subject: Moved Finished_Tokens and related types to Tokens package --- src/packrat-parse_graphs.adb | 192 ++++++++++++++++++------------------------- 1 file changed, 78 insertions(+), 114 deletions(-) (limited to 'src/packrat-parse_graphs.adb') diff --git a/src/packrat-parse_graphs.adb b/src/packrat-parse_graphs.adb index b919cff..2d5c2a5 100644 --- a/src/packrat-parse_graphs.adb +++ b/src/packrat-parse_graphs.adb @@ -29,70 +29,12 @@ package body Packrat.Parse_Graphs is end "="; - function "<" - (Left, Right : Finished_Token) - return Boolean - is - Left_Index, Right_Index : Positive; - begin - if Traits.Tokens.Start (Left.Token) = Traits.Tokens.Start (Right.Token) then - if Left.Finish = Right.Finish then - if Traits.Tokens.Label (Left.Token) = Traits.Tokens.Label (Right.Token) then - Left_Index := Traits.Tokens.Value (Left.Token)'First; - Right_Index := Traits.Tokens.Value (Right.Token)'First; - while Left_Index <= Traits.Tokens.Value (Left.Token)'Last and - Right_Index <= Traits.Tokens.Value (Right.Token)'Last - loop - if Traits.Tokens.Value (Left.Token) (Left_Index) < - Traits.Tokens.Value (Right.Token) (Right_Index) - then - return True; - elsif Traits.Tokens.Value (Left.Token) (Left_Index) /= - Traits.Tokens.Value (Right.Token) (Right_Index) - then - return False; - end if; - Left_Index := Left_Index + 1; - Right_Index := Right_Index + 1; - end loop; - return Traits.Tokens.Value (Left.Token)'Length < - Traits.Tokens.Value (Right.Token)'Length; - else - return Traits.Tokens.Label (Left.Token) < Traits.Tokens.Label (Right.Token); - end if; - else - return Left.Finish < Right.Finish; - end if; - else - return Traits.Tokens.Start (Left.Token) < Traits.Tokens.Start (Right.Token); - end if; - end "<"; - - - function "<" - (Left, Right : in Finished_Token_Array) - return Boolean - is - Left_Index : Positive := Left'First; - Right_Index : Positive := Right'First; - begin - while Left_Index <= Left'Last and Right_Index <= Right'Last loop - if Left (Left_Index) < Right (Right_Index) then - return True; - elsif Left (Left_Index) /= Right (Right_Index) then - return False; - end if; - Left_Index := Left_Index + 1; - Right_Index := Right_Index + 1; - end loop; - return Left'Length < Right'Length; - end "<"; - - function "<" (Left, Right : in Finished_Token_Vectors.Vector) return Boolean is + use type Ada.Containers.Count_Type; + use type Traits.Tokens.Finished_Token_Type; Left_Index : Positive := Left.First_Index; Right_Index : Positive := Right.First_Index; begin @@ -190,8 +132,8 @@ package body Packrat.Parse_Graphs is return Finish_Vectors.Vector is Result : Finish_Vectors.Vector; - Current : Finish_Type; - Node_Label : Traits.Tokens.Token; + Current : Traits.Tokens.Finish_Type; + Node_Label : Traits.Tokens.Token_Type; begin Node_Label := Container.Internal_Graph.Label (Node); for Fin_Token of Container.Root_Elems loop @@ -217,7 +159,7 @@ package body Packrat.Parse_Graphs is return Finish_Vectors.Vector is Result : Finish_Vectors.Vector; - Current : Finish_Type; + Current : Traits.Tokens.Finish_Type; begin for Edge of Container.Internal_Graph.Outbound (Node) loop Current := Container.Internal_Graph.Label (Edge).Group_Finish; @@ -261,7 +203,7 @@ package body Packrat.Parse_Graphs is end Image; Mapping : Enum_Node_Maps.Map := Generate_Map (Container); - Current : Traits.Tokens.Token; + Current : Traits.Tokens.Token_Type; Result : SU.Unbounded_String; begin for Iter in Mapping.Iterate loop @@ -272,7 +214,8 @@ package body Packrat.Parse_Graphs is for Fin of In_Finishes (Container, Node) loop SU.Append (Result, Image (Fin) & " ->" & Latin.HT); declare - Groupings : Token_Group_Array := Container.Subgroups ((Current, Fin)); + A_Fin_Token : Traits.Tokens.Finished_Token_Type := (Current, Fin); + Groupings : Token_Group_Array := Container.Subgroups (A_Fin_Token); begin if Groupings'Length = 0 then SU.Append (Result, "Leaf" & Latin.LF); @@ -309,7 +252,7 @@ package body Packrat.Parse_Graphs is function Contains (Container : in Parse_Graph; - Token : in Traits.Tokens.Token) + Token : in Traits.Tokens.Token_Type) return Boolean is begin return Container.Label_Map.Contains (Token); @@ -318,9 +261,10 @@ package body Packrat.Parse_Graphs is function Contains (Container : in Parse_Graph; - Position : in Finished_Token) + Position : in Traits.Tokens.Finished_Token_Type) return Boolean is + use type Traits.Tokens.Finished_Token_Type; Node : Node_ID_Type; begin if not Container.Contains (Position.Token) then @@ -374,13 +318,15 @@ package body Packrat.Parse_Graphs is function Reachable (Container : in Parse_Graph; - Position : in Finished_Token) + Position : in Traits.Tokens.Finished_Token_Type) return Boolean is -- This is basically a depth first search function. function Finder - (Current : in Finished_Token) - return Boolean is + (Current : in Traits.Tokens.Finished_Token_Type) + return Boolean + is + use type Traits.Tokens.Finished_Token_Type; begin return Current = Position or else (for some Grouping of Container.Subgroups (Current) => @@ -431,7 +377,7 @@ package body Packrat.Parse_Graphs is function Valid_Token - (Fin_Token : in Finished_Token) + (Fin_Token : in Traits.Tokens.Finished_Token_Type) return Boolean is begin return Fin_Token.Finish + 1 >= Traits.Tokens.Start (Fin_Token.Token); @@ -439,8 +385,8 @@ package body Packrat.Parse_Graphs is function Valid_Starts_Finishes - (Parent : in Finished_Token; - Subtokens : in Finished_Token_Array) + (Parent : in Traits.Tokens.Finished_Token_Type; + Subtokens : in Traits.Tokens.Finished_Token_Array) return Boolean is Subvec : Finished_Token_Vectors.Vector; @@ -468,13 +414,15 @@ package body Packrat.Parse_Graphs is function Loops_Introduced (Container : in Parse_Graph; - Parent : in Finished_Token; - Subtokens : in Finished_Token_Array) + Parent : in Traits.Tokens.Finished_Token_Type; + Subtokens : in Traits.Tokens.Finished_Token_Array) return Boolean is function Looper - (Current : in Finished_Token) - return Boolean is + (Current : in Traits.Tokens.Finished_Token_Type) + return Boolean + is + use type Traits.Tokens.Finished_Token_Type; begin if not Container.Contains (Current.Token) then return False; @@ -494,20 +442,24 @@ package body Packrat.Parse_Graphs is function Is_Sorted - (Finishes : in Finish_Array) + (Finishes : in Traits.Tokens.Finish_Array) return Boolean is - function Actual is new Sorted (Finish_Type, Finish_Array); + function Actual is new Sorted + (Traits.Tokens.Finish_Type, Traits.Tokens.Finish_Array); begin return Actual (Finishes); end Is_Sorted; function Is_Sorted - (Positions : in Finished_Token_Array) + (Positions : in Traits.Tokens.Finished_Token_Array) return Boolean is - function Actual is new Sorted (Finished_Token, Finished_Token_Array); + function Actual is new Sorted + (Traits.Tokens.Finished_Token_Type, + Traits.Tokens.Finished_Token_Array, + Traits.Tokens."<"); begin return Actual (Positions); end Is_Sorted; @@ -524,20 +476,24 @@ package body Packrat.Parse_Graphs is function No_Duplicates - (Finishes : in Finish_Array) + (Finishes : in Traits.Tokens.Finish_Array) return Boolean is - function Actual is new No_Dups (Finish_Type, Finish_Array); + function Actual is new No_Dups + (Traits.Tokens.Finish_Type, Traits.Tokens.Finish_Array); begin return Actual (Finishes); end No_Duplicates; function No_Duplicates - (Positions : in Finished_Token_Array) + (Positions : in Traits.Tokens.Finished_Token_Array) return Boolean is - function Actual is new No_Dups (Finished_Token, Finished_Token_Array); + function Actual is new No_Dups + (Traits.Tokens.Finished_Token_Type, + Traits.Tokens.Finished_Token_Array, + Traits.Tokens."="); begin return Actual (Positions); end No_Duplicates; @@ -558,7 +514,7 @@ package body Packrat.Parse_Graphs is procedure Include (Container : in out Parse_Graph; - Token : in Traits.Tokens.Token) + Token : in Traits.Tokens.Token_Type) is Node_ID : Node_ID_Type; begin @@ -572,8 +528,8 @@ package body Packrat.Parse_Graphs is procedure Connect (Container : in out Parse_Graph; - Parent : in Finished_Token; - Subtokens : in Finished_Token_Array) + Parent : in Traits.Tokens.Finished_Token_Type; + Subtokens : in Traits.Tokens.Finished_Token_Array) is Parent_ID : Node_ID_Type; Use_GID : Group_ID_Type; @@ -608,7 +564,7 @@ package body Packrat.Parse_Graphs is procedure Prune (Container : in out Parse_Graph; - Token : in Traits.Tokens.Token) is + Token : in Traits.Tokens.Token_Type) is begin if not Container.Contains (Token) then return; @@ -625,8 +581,9 @@ package body Packrat.Parse_Graphs is procedure Prune (Container : in out Parse_Graph; - Position : in Finished_Token) + Position : in Traits.Tokens.Finished_Token_Type) is + use type Traits.Tokens.Finished_Token_Type; Node : Node_ID_Type; begin if not Container.Contains (Position.Token) then @@ -735,7 +692,7 @@ package body Packrat.Parse_Graphs is procedure Set_Root (Container : in out Parse_Graph; - Tokens : in Finished_Token_Array) is + Tokens : in Traits.Tokens.Finished_Token_Array) is begin Container.Clear_Root; for Fin_Token of Tokens loop @@ -756,10 +713,12 @@ package body Packrat.Parse_Graphs is function Root_Elements (Container : in Parse_Graph) - return Finished_Token_Array + return Traits.Tokens.Finished_Token_Array is function V2A is new Vector_To_Array - (Finished_Token, Finished_Token_Array, Finished_Token_Vectors); + (Traits.Tokens.Finished_Token_Type, + Traits.Tokens.Finished_Token_Array, + Finished_Token_Vectors); begin return V2A (Container.Root_Elems); end Root_Elements; @@ -770,10 +729,11 @@ package body Packrat.Parse_Graphs is function Finish_List (Container : in Parse_Graph; - Token : in Traits.Tokens.Token) - return Finish_Array + Token : in Traits.Tokens.Token_Type) + return Traits.Tokens.Finish_Array is - function V2A is new Vector_To_Array (Finish_Type, Finish_Array, Finish_Vectors); + function V2A is new Vector_To_Array + (Traits.Tokens.Finish_Type, Traits.Tokens.Finish_Array, Finish_Vectors); Result : Finish_Vectors.Vector; begin for Fin_Token of Container.Root_Elems loop @@ -793,7 +753,7 @@ package body Packrat.Parse_Graphs is function Is_Leaf (Container : in Parse_Graph; - Position : in Finished_Token) + Position : in Traits.Tokens.Finished_Token_Type) return Boolean is begin for Edge of Container.Internal_Graph.Outbound @@ -809,7 +769,7 @@ package body Packrat.Parse_Graphs is function Is_Branch (Container : in Parse_Graph; - Position : in Finished_Token) + Position : in Traits.Tokens.Finished_Token_Type) return Boolean is begin return not Container.Is_Leaf (Position); @@ -821,14 +781,14 @@ package body Packrat.Parse_Graphs is function Subgroups (Container : in Parse_Graph; - Position : in Finished_Token) + Position : in Traits.Tokens.Finished_Token_Type) return Token_Group_Array is function V2A is new Vector_To_Array (Token_Group, Token_Group_Array, Token_Group_Vectors); Groupings : Group_Finished_Token_Maps.Map; Edge_Label : Edge_Label_Type; - Next_Token : Finished_Token; + Next_Token : Traits.Tokens.Finished_Token_Type; Result : Token_Group_Vectors.Vector; begin for Edge of Container.Internal_Graph.Outbound @@ -883,7 +843,7 @@ package body Packrat.Parse_Graphs is function Element (Grouping : in Token_Group; Index : in Positive) - return Finished_Token is + return Traits.Tokens.Finished_Token_Type is begin return Grouping.Elems.Element (Index); end Element; @@ -891,10 +851,12 @@ package body Packrat.Parse_Graphs is function Elements (Grouping : in Token_Group) - return Finished_Token_Array + return Traits.Tokens.Finished_Token_Array is function V2A is new Vector_To_Array - (Finished_Token, Finished_Token_Array, Finished_Token_Vectors); + (Traits.Tokens.Finished_Token_Type, + Traits.Tokens.Finished_Token_Array, + Finished_Token_Vectors); begin return V2A (Grouping.Elems); end Elements; @@ -902,7 +864,7 @@ package body Packrat.Parse_Graphs is function Parent (Grouping : in Token_Group) - return Finished_Token is + return Traits.Tokens.Finished_Token_Type is begin return Grouping.Parent; end Parent; @@ -910,7 +872,7 @@ package body Packrat.Parse_Graphs is function Finish (Grouping : in Token_Group) - return Finish_Type is + return Traits.Tokens.Finish_Type is begin return Grouping.Parent.Finish; end Finish; @@ -959,13 +921,15 @@ package body Packrat.Parse_Graphs is function Ambiguities (Container : in Parse_Graph; Ambiguous_Root : out Boolean) - return Finished_Token_Array + return Traits.Tokens.Finished_Token_Array is function V2A is new Vector_To_Array - (Finished_Token, Finished_Token_Array, Finished_Token_Vectors); + (Traits.Tokens.Finished_Token_Type, + Traits.Tokens.Finished_Token_Array, + Finished_Token_Vectors); Seen_Finishes : Finish_Group_Maps.Map; Edge_Label : Edge_Label_Type; - Next_Token : Finished_Token; + Next_Token : Traits.Tokens.Finished_Token_Type; Result : Finished_Token_Vectors.Vector; begin Ambiguous_Root := Container.Has_Root and then Container.Is_Root_Ambiguous; @@ -1037,9 +1001,9 @@ package body Packrat.Parse_Graphs is function Token_Isomorph (Left_Graph : in Parse_Graph; - Left_Position : in Finished_Token; + Left_Position : in Traits.Tokens.Finished_Token_Type; Right_Graph : in Parse_Graph; - Right_Position : in Finished_Token; + Right_Position : in Traits.Tokens.Finished_Token_Type; Offset : in Integer; Mapping : in out Isomorph_Maps.Map) return Boolean @@ -1115,9 +1079,9 @@ package body Packrat.Parse_Graphs is function Isomorphic_Subgraph (Left_Graph : in Parse_Graph; - Left_Position : in Finished_Token; + Left_Position : in Traits.Tokens.Finished_Token_Type; Right_Graph : in Parse_Graph; - Right_Position : in Finished_Token) + Right_Position : in Traits.Tokens.Finished_Token_Type) return Boolean is Offset : Integer := @@ -1136,7 +1100,7 @@ package body Packrat.Parse_Graphs is function To_Node (Container : in Parse_Graph; - Token : in Traits.Tokens.Token) + Token : in Traits.Tokens.Token_Type) return Node_ID_Type is begin return Container.Label_Map.Element (Token); @@ -1145,7 +1109,7 @@ package body Packrat.Parse_Graphs is function To_Node (Container : in Parse_Graph; - Position : in Finished_Token) + Position : in Traits.Tokens.Finished_Token_Type) return Node_ID_Type is begin return Container.Label_Map.Element (Position.Token); -- cgit