From e07aa7be550b1ecf557e554f680380dff5eef4cd Mon Sep 17 00:00:00 2001 From: Jed Barber Date: Thu, 3 Dec 2020 00:08:05 +1100 Subject: Revised how root nodes are handled in parse graphs --- src/packrat-parse_graphs.ads | 73 +++++++++++++++++++------------------------- 1 file changed, 31 insertions(+), 42 deletions(-) (limited to 'src/packrat-parse_graphs.ads') diff --git a/src/packrat-parse_graphs.ads b/src/packrat-parse_graphs.ads index fc5861d..4d2d956 100644 --- a/src/packrat-parse_graphs.ads +++ b/src/packrat-parse_graphs.ads @@ -7,7 +7,6 @@ with private with - Ada.Containers.Indefinite_Holders, Ada.Containers.Vectors, Ada.Containers.Ordered_Maps, Directed_Graphs; @@ -131,6 +130,10 @@ package Packrat.Parse_Graphs is return Boolean with Pre => Container.Has_Root; + function Valid_Token + (Fin_Token : in Finished_Token) + return Boolean; + function Valid_Starts_Finishes (Parent : in Finished_Token; Subtokens : in Finished_Token_Array) @@ -214,35 +217,19 @@ package Packrat.Parse_Graphs is procedure Set_Root (Container : in out Parse_Graph; - Token : in Traits.Tokens.Token; - Finishes : in Finish_Array) - with Pre => Container.Contains (Token) and - (for all F of Finishes => F >= Traits.Tokens.Start (Token) - 1), + Tokens : in Finished_Token_Array) + with Pre => (for all F of Tokens => Container.Contains (F.Token)), Post => Container.Has_Root; procedure Clear_Root (Container : in out Parse_Graph) with Post => not Container.Has_Root; - function Root_Token + function Root_Elements (Container : in Parse_Graph) - return Traits.Tokens.Token + return Finished_Token_Array with Pre => Container.Has_Root; - function Root_Finish_List - (Container : in Parse_Graph) - return Finish_Array - with Pre => Container.Has_Root, - Post => Is_Sorted (Root_Finish_List'Result) and - No_Duplicates (Root_Finish_List'Result); - - function Root_Element - (Container : in Parse_Graph; - Finish_At : in Finish_Type) - return Finished_Token - with Pre => Container.Has_Root and then - (for some F of Container.Root_Finish_List => F = Finish_At); - @@ -408,6 +395,24 @@ private + + package Finished_Token_Vectors is new Ada.Containers.Vectors + (Index_Type => Positive, + Element_Type => Finished_Token); + + function "<" + (Left, Right : in Finished_Token_Vectors.Vector) + return Boolean; + + type Token_Group is record + Parent : Finished_Token; + Elems : Finished_Token_Vectors.Vector; + end record; + + + + + package Finish_Vectors is new Ada.Containers.Vectors (Index_Type => Positive, Element_Type => Finish_Type); @@ -419,21 +424,9 @@ private Element_Type => Node_ID_Type); type Parse_Graph is tagged record - Internal_Graph : Base.Graph := Base.Empty_Graph; - Root_Node : Base.Extended_Node_ID_Type := Base.No_Node; - Root_Finishes : Finish_Vectors.Vector := Finish_Vectors.Empty_Vector; - Label_Map : Node_Label_Maps.Map := Node_Label_Maps.Empty_Map; - end record; - - - - - package Finished_Token_Array_Holders is new Ada.Containers.Indefinite_Holders - (Element_Type => Finished_Token_Array); - - type Token_Group is record - Parent : Finished_Token; - Elems : Finished_Token_Array_Holders.Holder; + Internal_Graph : Base.Graph := Base.Empty_Graph; + Root_Elems : Finished_Token_Vectors.Vector := Finished_Token_Vectors.Empty_Vector; + Label_Map : Node_Label_Maps.Map := Node_Label_Maps.Empty_Map; end record; @@ -448,10 +441,6 @@ private (Index_Type => Positive, Element_Type => Group_ID_Type); - package Finished_Token_Vectors is new Ada.Containers.Vectors - (Index_Type => Positive, - Element_Type => Finished_Token); - package Token_Group_Vectors is new Ada.Containers.Vectors (Index_Type => Positive, Element_Type => Token_Group); @@ -476,6 +465,7 @@ private + package Isomorph_Maps is new Ada.Containers.Ordered_Maps (Key_Type => Finished_Token, Element_Type => Finished_Token_Vectors.Vector, @@ -504,8 +494,7 @@ private Empty_Graph : constant Parse_Graph := (Internal_Graph => Base.Empty_Graph, - Root_Node => Base.No_Node, - Root_Finishes => Finish_Vectors.Empty_Vector, + Root_Elems => Finished_Token_Vectors.Empty_Vector, Label_Map => Node_Label_Maps.Empty_Map); -- cgit