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.adb30
1 files changed, 23 insertions, 7 deletions
diff --git a/src/packrat-parse_graphs.adb b/src/packrat-parse_graphs.adb
index 434c0a0..49ca752 100644
--- a/src/packrat-parse_graphs.adb
+++ b/src/packrat-parse_graphs.adb
@@ -288,21 +288,34 @@ package body Packrat.Parse_Graphs is
function Contains
(Container : in Parse_Graph;
Grouping : in Token_Group)
+ return Boolean is
+ begin
+ return Container.Contains (Grouping.Parent, Elements (Grouping));
+ end Contains;
+
+
+ function Contains
+ (Container : in Parse_Graph;
+ Parent : in Traits.Tokens.Finished_Token_Type;
+ Subtokens : in Traits.Tokens.Finished_Token_Array)
return Boolean
is
Groups : Group_ID_Vectors.Vector;
Next_ID : Group_ID_Type;
Parent_Node : Node_ID_Type;
begin
- if not Container.Contains (Grouping.Parent) then
+ if not Container.Contains (Parent.Token) then
return False;
end if;
- for Fin_Token of Elements (Grouping) loop
- if not Container.Contains (Fin_Token) then
+ for Fin_Token of Subtokens loop
+ if not Container.Contains (Fin_Token.Token) then
return False;
end if;
end loop;
- Parent_Node := Container.Label_Map.Element (Grouping.Parent.Token);
+ if not Valid_Starts_Finishes (Parent, Subtokens) then
+ return False;
+ end if;
+ Parent_Node := Container.Label_Map.Element (Parent.Token);
for Edge of Container.Internal_Graph.Outbound (Parent_Node) loop
Next_ID := Container.Internal_Graph.Label (Edge).Group_ID;
if not Groups.Contains (Next_ID) then
@@ -310,12 +323,12 @@ package body Packrat.Parse_Graphs is
end if;
end loop;
return (for some ID of Groups =>
- (for all Sub of Elements (Grouping) =>
+ (for all Sub of Subtokens =>
(for some Edge of Container.Internal_Graph.Between
(Parent_Node, Container.Label_Map.Element (Sub.Token)) =>
Container.Internal_Graph.Label (Edge) =
- (Group_ID => ID,
- Group_Finish => Finish (Grouping),
+ (Group_ID => ID,
+ Group_Finish => Parent.Finish,
Subnode_Finish => Sub.Finish))));
end Contains;
@@ -540,6 +553,9 @@ package body Packrat.Parse_Graphs is
New_Edge : Base.Edge_Type;
New_Label : Edge_Label_Type;
begin
+ if Container.Contains (Parent, Subtokens) then
+ return;
+ end if;
Container.Include (Parent.Token);
for Sub of Subtokens loop
Container.Include (Sub.Token);