package body Packrat.Lexer.Debug is function Create_Result (Length : in Natural; Status : in Result_Status; Value : in Element_Array) return Combinator_Result is This : Combinator_Result; begin This.Length := Length; This.Status := Status; This.Value := new Element_Array (1 .. Value'Length); This.Value.all := Value; return This; end Create_Result; function Join (Left, Right : in Combinator_Result) return Combinator_Result is Merge : Combinator_Result; Left_Valsize, Right_Valsize, Total_Valsize : Natural; begin if Left.Value /= null then Left_Valsize := Left.Value.all'Length; else Left_Valsize := 0; end if; if Right.Value /= null then Right_Valsize := Right.Value.all'Length; else Right_Valsize := 0; end if; Total_Valsize := Left_Valsize + Right_Valsize; if Left.Status = Success or Left.Status = Optional_More then Merge.Length := Left.Length + Right.Length; Merge.Status := Right.Status; if Total_Valsize > 0 then Merge.Value := new Element_Array (1 .. Total_Valsize); if Left.Value /= null then Merge.Value.all (1 .. Left_Valsize) := Left.Value.all; end if; if Right.Value /= null then Merge.Value.all (Left_Valsize + 1 .. Total_Valsize) := Right.Value.all; end if; end if; return Merge; elsif Left.Status = Needs_More then Merge := Left; Merge.Status := Failure; return Merge; else return Left; end if; end Join; function Status (This : in Combinator_Result) return Result_Status is begin return This.Status; end Status; function Debug_String (This : in Combinator_Result) return String is Value_Length : Natural; begin if This.Value = null then Value_Length := 0; else Value_Length := This.Value.all'Length; end if; return Integer'Image (This.Length) & " " & Result_Status'Image (This.Status) & " " & Integer'Image (Value_Length); end Debug_String; function So_Far (This : in Lexer_Context) return Token_Vector is begin return (This.Result_So_Far with null record); end So_Far; function Position (This : in Lexer_Context) return Positive is begin return This.Position; end Position; function Status (This : in Lexer_Context) return Result_Status is begin return This.Status; end Status; function Pass (This : in Lexer_Context) return access Element_Array is begin return This.Pass_Forward; end Pass; function Length (Vec : in Token_Vector) return Natural is begin return Integer (Token_Vectors.Vector (Vec).Length); end Length; function Element (Vec : in Token_Vector; Dex : in Positive) return Gen_Tokens.Token is begin return Token_Vectors.Vector (Vec).Element (Dex); end Element; end Packrat.Lexer.Debug;