summaryrefslogtreecommitdiff
path: root/src/packrat-parse_graphs.ads
diff options
context:
space:
mode:
Diffstat (limited to 'src/packrat-parse_graphs.ads')
-rw-r--r--src/packrat-parse_graphs.ads121
1 files changed, 53 insertions, 68 deletions
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;