diff options
author | Jed Barber <jjbarber@y7mail.com> | 2020-12-03 20:12:55 +1100 |
---|---|---|
committer | Jed Barber <jjbarber@y7mail.com> | 2020-12-03 20:12:55 +1100 |
commit | d492b9de86bc23d60799c8fb45720fd73e6d57be (patch) | |
tree | 9a8c76327ec02cd02bf81fbd6bdcd2bfd380030e /src/packrat-parsers.adb | |
parent | fdfd7f9b0bd01d671cd1fc14aea7e33092ed72f8 (diff) |
Made parse functions distinct from stamp/ignore functions
Diffstat (limited to 'src/packrat-parsers.adb')
-rw-r--r-- | src/packrat-parsers.adb | 46 |
1 files changed, 24 insertions, 22 deletions
diff --git a/src/packrat-parsers.adb b/src/packrat-parsers.adb index 85bfbc9..6672dc3 100644 --- a/src/packrat-parsers.adb +++ b/src/packrat-parsers.adb @@ -359,27 +359,31 @@ package body Packrat.Parsers is function Finish_Root (Root_Result : in Combinator_Result; - Context : in out Parser_Context; - Label : in Traits.Label_Enum) + Context : in out Parser_Context) return Graphs.Parse_Graph is - Root_Elems : Graphs.Finished_Token_Array (1 .. Integer (Root_Result.Results.Length)); + Length : Natural := 0; Index : Positive := 1; begin for R of Root_Result.Results loop - Root_Elems (Index) := - (Token => Traits.Tokens.Create (Label, Context.Global_Start, R.Value.Element), - Finish => R.Finish); - if R.Tokens.Element'Length > 0 then - Context.Result_So_Far.Connect (Root_Elems (Index), R.Tokens.Element); - else - Context.Result_So_Far.Include (Root_Elems (Index).Token); - end if; - Index := Index + 1; + Length := Length + Integer (R.Tokens.Element'Length); end loop; - Context.Result_So_Far.Set_Root (Root_Elems); - Context.Result_So_Far.Delete_Unreachable; - return Context.Result_So_Far; + if Length = 0 then + return Graphs.Empty_Graph; + end if; + declare + Root_Elems : Graphs.Finished_Token_Array (1 .. Length); + begin + for R of Root_Result.Results loop + for T of R.Tokens.Element loop + Root_Elems (Index) := T; + Index := Index + 1; + end loop; + end loop; + Context.Result_So_Far.Set_Root (Root_Elems); + Context.Result_So_Far.Delete_Unreachable; + return Context.Result_So_Far; + end; end Finish_Root; @@ -400,11 +404,10 @@ package body Packrat.Parsers is Root (Real_Input, Context, Context.Global_Start); begin if Root_Result.Status = Failure then - raise Parser_Error with Packrat.Errors.Encode - (Traits.Label_Enum'Image (Label), Context.Global_Start); + raise Parser_Error; end if; if Input'Length = 0 then - Result := Finish_Root (Root_Result, Context, Label); + Result := Finish_Root (Root_Result, Context); return; end if; if not Context.Needs_More.Is_Empty then @@ -436,10 +439,9 @@ package body Packrat.Parsers is Root (Real_Input, Context, Context.Global_Start); begin if Root_Result.Status /= Success then - raise Parser_Error with Packrat.Errors.Encode - (Traits.Label_Enum'Image (Label), Context.Global_Start); + raise Parser_Error; end if; - return Finish_Root (Root_Result, Context, Label); + return Finish_Root (Root_Result, Context); end; end Parse_Only; @@ -449,7 +451,7 @@ package body Packrat.Parsers is Context : in out Parser_Context) return Graphs.Parse_Graph is - procedure My_Parse is new Parse (Label, Root); + procedure My_Parse is new Parse (Root); Result : Graphs.Parse_Graph; begin loop |