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.ads | 121 +++++++++++++++++++------------------------ 1 file changed, 53 insertions(+), 68 deletions(-) (limited to 'src/packrat-parse_graphs.ads') diff --git a/src/packrat-parse_graphs.ads b/src/packrat-parse_graphs.ads index 208292c..7d14652 100644 --- a/src/packrat-parse_graphs.ads +++ b/src/packrat-parse_graphs.ads @@ -27,26 +27,7 @@ package Packrat.Parse_Graphs is Empty_Graph : constant Parse_Graph; - subtype Finish_Type is Natural; - type Finish_Array is array (Positive range <>) of Finish_Type; - - type Finished_Token is record - Token : Traits.Tokens.Token; - Finish : Finish_Type; - end record; - - type Finished_Token_Array is array (Positive range <>) of Finished_Token; - - function "<" - (Left, Right : in Finished_Token) - return Boolean; - - function "<" - (Left, Right : in Finished_Token_Array) - return Boolean; - - use type Ada.Containers.Count_Type; - type Token_Group is private with Type_Invariant => Length (Token_Group) > 0; + type Token_Group is private with Type_Invariant => Integer (Length (Token_Group)) > 0; type Token_Group_Array is array (Positive range <>) of Token_Group; function "<" @@ -89,12 +70,12 @@ package Packrat.Parse_Graphs is function Contains (Container : in Parse_Graph; - Token : in Traits.Tokens.Token) + Token : in Traits.Tokens.Token_Type) return Boolean; function Contains (Container : in Parse_Graph; - Position : in Finished_Token) + Position : in Traits.Tokens.Finished_Token_Type) return Boolean; function Contains @@ -104,7 +85,7 @@ package Packrat.Parse_Graphs is function Reachable (Container : in Parse_Graph; - Position : in Finished_Token) + Position : in Traits.Tokens.Finished_Token_Type) return Boolean with Pre => Container.Has_Root; @@ -114,29 +95,29 @@ package Packrat.Parse_Graphs is with Pre => Container.Has_Root; function Valid_Token - (Fin_Token : in Finished_Token) + (Fin_Token : in Traits.Tokens.Finished_Token_Type) return Boolean; 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 with Pre => Subtokens'Length > 0; 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 with Pre => Subtokens'Length > 0 and Valid_Starts_Finishes (Parent, Subtokens); function Is_Sorted - (Finishes : in Finish_Array) + (Finishes : in Traits.Tokens.Finish_Array) return Boolean; function Is_Sorted - (Positions : in Finished_Token_Array) + (Positions : in Traits.Tokens.Finished_Token_Array) return Boolean; function Is_Sorted @@ -144,11 +125,11 @@ package Packrat.Parse_Graphs is return Boolean; function No_Duplicates - (Finishes : in Finish_Array) + (Finishes : in Traits.Tokens.Finish_Array) return Boolean; function No_Duplicates - (Positions : in Finished_Token_Array) + (Positions : in Traits.Tokens.Finished_Token_Array) return Boolean; function No_Duplicates @@ -160,25 +141,25 @@ package Packrat.Parse_Graphs is procedure Include (Container : in out Parse_Graph; - Token : in Traits.Tokens.Token) + Token : in Traits.Tokens.Token_Type) with Post => Container.Contains (Token); 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) with Pre => Subtokens'Length > 0 and Valid_Starts_Finishes (Parent, Subtokens) and not Container.Loops_Introduced (Parent, Subtokens); procedure Prune (Container : in out Parse_Graph; - Token : in Traits.Tokens.Token) + Token : in Traits.Tokens.Token_Type) with Post => not Container.Contains (Token); procedure Prune (Container : in out Parse_Graph; - Position : in Finished_Token) + Position : in Traits.Tokens.Finished_Token_Type) with Post => not Container.Contains (Position); procedure Prune @@ -200,7 +181,7 @@ package Packrat.Parse_Graphs is procedure Set_Root (Container : in out Parse_Graph; - Tokens : in Finished_Token_Array) + Tokens : in Traits.Tokens.Finished_Token_Array) with Pre => (for all F of Tokens => Container.Contains (F.Token)), Post => Container.Has_Root; @@ -210,7 +191,7 @@ package Packrat.Parse_Graphs is function Root_Elements (Container : in Parse_Graph) - return Finished_Token_Array + return Traits.Tokens.Finished_Token_Array with Pre => Container.Has_Root; @@ -218,21 +199,21 @@ package 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 with Pre => Container.Contains (Token), Post => Is_Sorted (Finish_List'Result) and No_Duplicates (Finish_List'Result); function Is_Leaf (Container : in Parse_Graph; - Position : in Finished_Token) + Position : in Traits.Tokens.Finished_Token_Type) return Boolean with Pre => Container.Contains (Position); function Is_Branch (Container : in Parse_Graph; - Position : in Finished_Token) + Position : in Traits.Tokens.Finished_Token_Type) return Boolean with Pre => Container.Contains (Position); @@ -241,7 +222,7 @@ package 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 with Pre => Container.Contains (Position), Post => Is_Sorted (Subgroups'Result) and @@ -263,22 +244,22 @@ package Packrat.Parse_Graphs is function Element (Grouping : in Token_Group; Index : in Positive) - return Finished_Token + return Traits.Tokens.Finished_Token_Type with Pre => Index in First_Index (Grouping) .. Last_Index (Grouping); function Elements (Grouping : in Token_Group) - return Finished_Token_Array + return Traits.Tokens.Finished_Token_Array with Post => Is_Sorted (Elements'Result) and Valid_Starts_Finishes (Parent (Grouping), Elements'Result); function Parent (Grouping : in Token_Group) - return Finished_Token; + return Traits.Tokens.Finished_Token_Type; function Finish (Grouping : in Token_Group) - return Finish_Type; + return Traits.Tokens.Finish_Type; @@ -300,7 +281,7 @@ package Packrat.Parse_Graphs is function Ambiguities (Container : in Parse_Graph; Ambiguous_Root : out Boolean) - return Finished_Token_Array + return Traits.Tokens.Finished_Token_Array with Post => Is_Sorted (Ambiguities'Result) and No_Duplicates (Ambiguities'Result); @@ -314,9 +295,9 @@ package 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 with Pre => Left_Graph.Contains (Left_Position) and Right_Graph.Contains (Right_Position); @@ -335,14 +316,14 @@ private type Node_ID_Type is new Positive; type Edge_ID_Type is new Positive; - subtype Node_Label_Type is Traits.Tokens.Token; + subtype Node_Label_Type is Traits.Tokens.Token_Type; subtype Group_ID_Type is Positive; type Edge_Label_Type is record Group_ID : Group_ID_Type; - Group_Finish : Finish_Type; - Subnode_Finish : Finish_Type; + Group_Finish : Traits.Tokens.Finish_Type; + Subnode_Finish : Traits.Tokens.Finish_Type; end record; @@ -350,12 +331,12 @@ private function To_Node (Container : in Parse_Graph; - Token : in Traits.Tokens.Token) + Token : in Traits.Tokens.Token_Type) return Node_ID_Type; function To_Node (Container : in Parse_Graph; - Position : in Finished_Token) + Position : in Traits.Tokens.Finished_Token_Type) return Node_ID_Type; function Locally_Reachable @@ -368,7 +349,7 @@ private -- This 'use type' is to avoid some ambiguities with "=" functions when -- instantiating the Base package. - use type Traits.Tokens.Token; + use type Traits.Tokens.Token_Type; package Base is new Directed_Graphs (Node_ID_Type => Node_ID_Type, @@ -382,14 +363,15 @@ private package Finished_Token_Vectors is new Ada.Containers.Vectors (Index_Type => Positive, - Element_Type => Finished_Token); + Element_Type => Traits.Tokens.Finished_Token_Type, + "=" => Traits.Tokens."="); function "<" (Left, Right : in Finished_Token_Vectors.Vector) return Boolean; type Token_Group is record - Parent : Finished_Token; + Parent : Traits.Tokens.Finished_Token_Type; Elems : Finished_Token_Vectors.Vector; end record; @@ -399,13 +381,14 @@ private package Finish_Vectors is new Ada.Containers.Vectors (Index_Type => Positive, - Element_Type => Finish_Type); + Element_Type => Traits.Tokens.Finish_Type); package Finish_Sort is new Finish_Vectors.Generic_Sorting; package Node_Label_Maps is new Ada.Containers.Ordered_Maps - (Key_Type => Traits.Tokens.Token, - Element_Type => Node_ID_Type); + (Key_Type => Traits.Tokens.Token_Type, + Element_Type => Node_ID_Type, + "<" => Traits.Tokens."<"); type Parse_Graph is tagged record Internal_Graph : Base.Graph := Base.Empty_Graph; @@ -429,7 +412,8 @@ private (Index_Type => Positive, Element_Type => Token_Group); - package Finished_Token_Sort is new Finished_Token_Vectors.Generic_Sorting; + package Finished_Token_Sort is new + Finished_Token_Vectors.Generic_Sorting ("<" => Traits.Tokens."<"); package Token_Group_Sort is new Token_Group_Vectors.Generic_Sorting; package Group_Finished_Token_Maps is new Ada.Containers.Ordered_Maps @@ -438,7 +422,7 @@ private "=" => Finished_Token_Vectors."="); package Finish_Group_Maps is new Ada.Containers.Ordered_Maps - (Key_Type => Finish_Type, + (Key_Type => Traits.Tokens.Finish_Type, Element_Type => Group_ID_Type); package Enum_Node_Maps is new Ada.Containers.Ordered_Maps @@ -451,9 +435,10 @@ private package Isomorph_Maps is new Ada.Containers.Ordered_Maps - (Key_Type => Finished_Token, + (Key_Type => Traits.Tokens.Finished_Token_Type, Element_Type => Finished_Token_Vectors.Vector, - "=" => Finished_Token_Vectors."="); + "=" => Finished_Token_Vectors."=", + "<" => Traits.Tokens."<"); function Group_Isomorph (Left_Graph : in Parse_Graph; @@ -466,9 +451,9 @@ private 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; -- cgit