From eccf08d5ee8915688841b47cff1d487732da8f06 Mon Sep 17 00:00:00 2001 From: Jed Barber Date: Thu, 12 Nov 2020 01:18:42 +1100 Subject: Isomorphism functions complete --- src/packrat-parse_graphs.ads | 44 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 37 insertions(+), 7 deletions(-) (limited to 'src/packrat-parse_graphs.ads') diff --git a/src/packrat-parse_graphs.ads b/src/packrat-parse_graphs.ads index aced9d3..2912110 100644 --- a/src/packrat-parse_graphs.ads +++ b/src/packrat-parse_graphs.ads @@ -343,7 +343,8 @@ package Packrat.Parse_Graphs is function Isomorphic (Left, Right : in Parse_Graph) - return Boolean; + return Boolean + with Pre => Left.Has_Root and Right.Has_Root; function Isomorphic_Subgraph (Left_Graph : in Parse_Graph; @@ -422,12 +423,6 @@ private Label_Map : Node_Label_Maps.Map := Node_Label_Maps.Empty_Map; end record; - Empty_Graph : constant Parse_Graph := - (Internal_Graph => Base.Empty_Graph, - Root_Node => Base.No_Node, - Root_Finishes => Finish_Vectors.Empty_Vector, - Label_Map => Node_Label_Maps.Empty_Map); - @@ -479,6 +474,41 @@ private + package Isomorph_Maps is new Ada.Containers.Ordered_Maps + (Key_Type => Finished_Token, + Element_Type => Finished_Token_Vectors.Vector, + "=" => Finished_Token_Vectors."="); + + function Group_Isomorph + (Left_Graph : in Parse_Graph; + Left_Token_Group : in Token_Group; + Right_Graph : in Parse_Graph; + Right_Token_Group : in Token_Group; + Offset : in Integer; + Mapping : in out Isomorph_Maps.Map) + return Boolean; + + function Token_Isomorph + (Left_Graph : in Parse_Graph; + Left_Position : in Finished_Token; + Right_Graph : in Parse_Graph; + Right_Position : in Finished_Token; + Offset : in Integer; + Mapping : in out Isomorph_Maps.Map) + return Boolean; + + + + + Empty_Graph : constant Parse_Graph := + (Internal_Graph => Base.Empty_Graph, + Root_Node => Base.No_Node, + Root_Finishes => Finish_Vectors.Empty_Vector, + Label_Map => Node_Label_Maps.Empty_Map); + + + + generic type Base_Type is private; type Array_Type is array (Positive range <>) of Base_Type; -- cgit