with Ada.Containers.Vectors; package SPDX is type Expression (<>) is private; function Parse (Str : String; Allow_Custom : Boolean := False) return Expression; -- Parse an SPDX expression from string. -- -- If Allow_Custom is True, the parser will accept custom license id with -- the format: "custom-[0-9a-zA-Z.-]+". function Valid (This : Expression) return Boolean; -- Return True if the SPDX expression is valid function Error (This : Expression) return String with Pre => not Valid (This); -- Return the error message for an invalid SPDX expression function Img (This : Expression) return String with Pre => Valid (This); -- Return the string representation of a valid SPDX expression function Has_Custom (This : Expression) return Boolean; -- Return True if the expression contains a custom license ID private subtype Id_Characters is Character with Dynamic_Predicate => Id_Characters in 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '-' | '.'; subtype Id_String is String with Dynamic_Predicate => (for all C of Id_String => C in Id_Characters); subtype Whitespace_Characters is Character with Dynamic_Predicate => Whitespace_Characters in ' ' | ASCII.HT; type Token_Kind is (Op_Or_Later, Op_With, Op_Or, Op_And, Id_Str, Paren_Open, Paren_Close); subtype Operator is Token_Kind range Op_Or_Later .. Op_And; type Location is record From, To : Natural; end record; type Token is record Kind : Token_Kind; Loc : Location; -- Position in the parsed string end record; package Token_Vector is new Ada.Containers.Vectors (Index_Type => Natural, Element_Type => Token); type Error_Kind is (None, Or_Later_Misplaced, Invalid_Char, Operator_Lowcase, Unexpected_Token, Paren_Close_Expected, License_Id_Expected, Invalid_License_Id, Exception_Id_Expected, Invalid_Exception_Id, Empty_Expression); type Expression (Str_Len : Natural) is record Str : String (1 .. Str_Len); Tokens : Token_Vector.Vector; Error : Error_Kind := None; Err_Loc : Location; Allow_Custom : Boolean := False; Has_Custom_Id : Boolean := False; end record; procedure Tokenize (This : in out Expression) with Pre => This.Tokens.Is_Empty; end SPDX;