with Ada.Characters.Latin_1; package body Packrat.Tokens is package SU renames Ada.Strings.Unbounded; package Latin renames Ada.Characters.Latin_1; function "<" (Left, Right : in Token) return Boolean is Left_Index, Right_Index : Positive; begin if Left.Start_At = Right.Start_At then if Left.Identifier = Right.Identifier then Left_Index := Left.Token_Value.Constant_Reference.Element'First; Right_Index := Right.Token_Value.Constant_Reference.Element'First; while Left_Index <= Left.Token_Value.Constant_Reference.Element'Last and Right_Index <= Right.Token_Value.Constant_Reference.Element'Last loop if Left.Token_Value.Constant_Reference.Element (Left_Index) < Right.Token_Value.Constant_Reference.Element (Right_Index) then return True; elsif Left.Token_Value.Constant_Reference.Element (Left_Index) /= Right.Token_Value.Constant_Reference.Element (Right_Index) then return False; end if; Left_Index := Left_Index + 1; Right_Index := Right_Index + 1; end loop; return Left.Token_Value.Constant_Reference.Element'Length < Right.Token_Value.Constant_Reference.Element'Length; else return Left.Identifier < Right.Identifier; end if; else return Left.Start_At < Right.Start_At; end if; end "<"; function Create (Ident : in Label_Enum; Start : in Positive; Value : in Element_Array) return Token is begin return This : Token do This.Identifier := Ident; This.Start_At := Start; This.Token_Value := Value_Holders.To_Holder (Value); end return; end Create; function Debug_String (This : in Token) return String is Result : SU.Unbounded_String := +""; begin SU.Append (Result, "Token " & Label_Enum'Image (This.Identifier) & " at input position" & Integer'Image (This.Start_At) & " with value length" & Integer'Image (This.Token_Value.Constant_Reference.Element'Length) & Latin.LF); return -Result; end Debug_String; function Label (This : in Token) return Label_Enum is begin return This.Identifier; end Label; function Start (This : in Token) return Positive is begin return This.Start_At; end Start; function Value (This : in Token) return Element_Array is begin return This.Token_Value.Element; end Value; end Packrat.Tokens;