with Ada.Strings.Unbounded; private with Ada.Containers.Indefinite_Holders; package Packrat is type Result_Status is (Failure, Needs_More, Optional_More, Success); Parser_Error : exception; Lexer_Error : exception; package Errors is subtype Error_Message is String with Dynamic_Predicate => Valid_Message (Error_Message); type Error_Info is record Symbol : Ada.Strings.Unbounded.Unbounded_String; Position : Natural; end record; type Error_Info_Array is array (Positive range <>) of Error_Info; -- Note: No consideration is given to ordering of Error_Info items -- encoded into an Error_Message string. -- Note: Using "&" to join two Valid Error_Messages together -- will result in an Error_Message that is also Valid, -- but for best results Join should be used instead to -- prevent duplication of Error_Info in the message. function Valid_Identifier (Check : in String) return Boolean; function Valid_Identifier (Check : in Ada.Strings.Unbounded.Unbounded_String) return Boolean; function Valid_Identifier_Array (Check : in Error_Info_Array) return Boolean; function Valid_Message (Check : in String) return Boolean; function Debug_String (This : in Error_Message) return String; function Join (Left, Right : in Error_Message) return Error_Message; function Encode (Name : in String; Pos : in Natural) return Error_Message with Pre => Valid_Identifier (Name); function Encode (Name : in Ada.Strings.Unbounded.Unbounded_String; Pos : in Natural) return Error_Message with Pre => Valid_Identifier (Name); function Encode (Info : in Error_Info) return Error_Message with Pre => Valid_Identifier (Info.Symbol); function Encode_Array (Info : in Error_Info_Array) return Error_Message with Pre => Valid_Identifier_Array (Info); function Decode (Msg : in Error_Message) return Error_Info_Array; end Errors; generic type Label_Enum is (<>); type Element is private; type Element_Array is array (Positive range <>) of Element; package Tokens is type Token is private; type Token_Array is array (Positive range <>) of Token; function Create (Ident : in Label_Enum; Start : in Positive; Value : in Element_Array) return Token; -- Note: The Start index indicate where the token was found -- in whatever array it was lexed from. The Value does *not* -- have to correspond with whatever is found there. function Debug_String (This : in Token) return String; function Label (This : in Token) return Label_Enum; function Start (This : in Token) return Positive; function Value (This : in Token) return Element_Array; private package Value_Holders is new Ada.Containers.Indefinite_Holders (Element_Array); type Token is record Identifier : Label_Enum; Start_At : Positive; Token_Value : Value_Holders.Holder; end record; end Tokens; private function "+" (S : in String) return Ada.Strings.Unbounded.Unbounded_String renames Ada.Strings.Unbounded.To_Unbounded_String; function "-" (US : in Ada.Strings.Unbounded.Unbounded_String) return String renames Ada.Strings.Unbounded.To_String; end Packrat;