summaryrefslogtreecommitdiff
path: root/src/packrat-parse_graphs.adb
diff options
context:
space:
mode:
Diffstat (limited to 'src/packrat-parse_graphs.adb')
-rw-r--r--src/packrat-parse_graphs.adb192
1 files changed, 78 insertions, 114 deletions
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
@@ -30,69 +30,11 @@ package body Packrat.Parse_Graphs is
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);