private with Ada.Containers.Vectors, Ada.Containers.Ordered_Sets; generic type Label_Enum is (<>); type Element is private; type Element_Array is array (Positive range <>) of Element; with package Gen_Tokens is new Tokens (Label_Enum, Element, Element_Array); package Packrat.Lexer is type Combinator_Result is private; type Combinator is access function (Input : in Element_Array; Start : in Positive) return Combinator_Result; type Combinator_Array is array (Positive range <>) of Combinator; type Lexer_Context is new Ada.Finalization.Controlled with private; Empty_Context : constant Lexer_Context; type Component_Result is private; type Component is access function (Input : in Element_Array; Context : in out Lexer_Context) return Component_Result; type Component_Array is array (Positive range <>) of Component; type With_Input is access function return Element_Array; generic Label : in Label_Enum; with function Combo (Input : in Element_Array; Start : in Positive) return Combinator_Result; function Stamp (Input : in Element_Array; Context : in out Lexer_Context) return Component_Result; generic Label : in Label_Enum; with function Combo (Input : in Element_Array; Start : in Positive) return Combinator_Result; function Ignore (Input : in Element_Array; Context : in out Lexer_Context) return Component_Result; generic Components : in Component_Array; function Scan (Input : in Element_Array; Context : in out Lexer_Context) return Gen_Tokens.Token_Array; generic Components : in Component_Array; function Scan_Only (Input : in Element_Array; Context : in out Lexer_Context) return Gen_Tokens.Token_Array; generic Components : in Component_Array; function Scan_With (Input : in With_Input; Context : in out Lexer_Context) return Gen_Tokens.Token_Array; generic Components : in Component_Array; Pad_In : in Element; Pad_Out : in Gen_Tokens.Token; procedure Scan_Set (Input : in Element_Array; Context : in out Lexer_Context; Output : out Gen_Tokens.Token_Array); generic Components : in Component_Array; Pad_In : in Element; Pad_Out : in Gen_Tokens.Token; procedure Scan_Set_With (Input : in With_Input; Context : in out Lexer_Context; Output : out Gen_Tokens.Token_Array); generic Params : in Combinator_Array; function Sequence (Input : in Element_Array; Start : in Positive) return Combinator_Result; generic with function Param (Input : in Element_Array; Start : in Positive) return Combinator_Result; Number : in Positive; function Count (Input : in Element_Array; Start : in Positive) return Combinator_Result; generic with function Param (Input : in Element_Array; Start : in Positive) return Combinator_Result; Minimum : in Natural := 0; function Many (Input : in Element_Array; Start : in Positive) return Combinator_Result; generic with function Param (Input : in Element_Array; Start : in Positive) return Combinator_Result; with function Test (Item : in Element) return Boolean; Minimum : in Natural := 0; function Many_Until (Input : in Element_Array; Start : in Positive) return Combinator_Result; generic with function Test (Item : in Element) return Boolean; function Satisfy (Input : in Element_Array; Start : in Positive) return Combinator_Result; generic with function Test (Item : in Element) return Boolean; with function Change (From : in Element) return Element; function Satisfy_With (Input : in Element_Array; Start : in Positive) return Combinator_Result; generic Item : in Element; function Match (Input : in Element_Array; Start : in Positive) return Combinator_Result; generic Item : in Element; with function Change (From : in Element) return Element; function Match_With (Input : in Element_Array; Start : in Positive) return Combinator_Result; generic Items : in Element_Array; function Multimatch (Input : in Element_Array; Start : in Positive) return Combinator_Result; generic Number : in Positive := 1; function Take (Input : in Element_Array; Start : in Positive) return Combinator_Result; generic with function Test (Item : in Element) return Boolean; function Take_While (Input : in Element_Array; Start : in Positive) return Combinator_Result; generic with function Test (Item : in Element) return Boolean; function Take_Until (Input : in Element_Array; Start : in Positive) return Combinator_Result; generic EOL_Item : in Element; function Line_End (Input : in Element_Array; Start : in Positive) return Combinator_Result; generic EOF_Item : in Element; function Input_End (Input : in Element_Array; Start : in Positive) return Combinator_Result; private package Token_Vectors is new Ada.Containers.Vectors (Index_Type => Positive, Element_Type => Gen_Tokens.Token, "=" => Gen_Tokens."="); type Element_Array_Access is access all Element_Array; Empty_Array : Element_Array (1 .. 0); package Label_Vectors is new Ada.Containers.Vectors (Index_Type => Positive, Element_Type => Label_Enum); package Label_Sets is new Ada.Containers.Ordered_Sets (Element_Type => Label_Enum); type Combinator_Result is record Finish : Natural; Status : Result_Status; end record; Empty_Fail : constant Combinator_Result := (Finish => 0, Status => Failure); type Component_Result is (Component_Failure, Component_Success); type Lexer_Context is new Ada.Finalization.Controlled with record Result_So_Far : Token_Vectors.Vector; Position : Positive; Offset : Natural; Status : Result_Status; Pass_Forward : Element_Array_Access; Empty_Labels : Label_Sets.Set; Error_Labels : Label_Vectors.Vector; Allow_Incomplete : Boolean; end record; overriding procedure Initialize (This : in out Lexer_Context); overriding procedure Adjust (This : in out Lexer_Context); overriding procedure Finalize (This : in out Lexer_Context); Empty_Context : constant Lexer_Context := (Ada.Finalization.Controlled with Result_So_Far => Token_Vectors.Empty_Vector, Position => 1, Offset => 0, Status => Success, Pass_Forward => null, Empty_Labels => Label_Sets.Empty_Set, Error_Labels => Label_Vectors.Empty_Vector, Allow_Incomplete => True); type Input_Container is new Ada.Finalization.Limited_Controlled with record Data : Element_Array_Access; Dealloc : Boolean; end record; overriding procedure Finalize (This : in out Input_Container); function Pass_Input (Passed, Continuing : in Element_Array_Access) return Input_Container; end Packrat.Lexer;