-- This source is licensed under the Sunset License v1.0 with Unit_Tests; use Unit_Tests; private with Packrat.No_Lex, Packrat.Utilities, Packrat.Parsers.Debug, Packrat.Errors, Packrat.Traits; package Rat_Tests.Parsers is function Sequence_Check return Test_Result; function Sequence_2_Check return Test_Result; function Choice_Check return Test_Result; function Choice_2_Check return Test_Result; function Count_Check return Test_Result; function Many_Nomin_Check return Test_Result; function Many_Min_Check return Test_Result; function Followed_By_Check return Test_Result; function Not_Followed_By_Check return Test_Result; function Many_Until_Nomin_Check return Test_Result; function Many_Until_Min_Check return Test_Result; function Satisfy_Check return Test_Result; function Satisfy_With_Check return Test_Result; function Match_Check return Test_Result; function Match_With_Check return Test_Result; function Multimatch_Check return Test_Result; function Take_Check return Test_Result; function Take_While_Check return Test_Result; function Take_Until_Check return Test_Result; function Empty_Check return Test_Result; function Not_Empty_Check return Test_Result; Combinator_Tests : Test_Array := ((+"Sequence", Sequence_Check'Access), (+"Sequence_2", Sequence_2_Check'Access), (+"Choice", Choice_Check'Access), (+"Choice_2", Choice_2_Check'Access), (+"Count", Count_Check'Access), (+"Many No Minimum", Many_Nomin_Check'Access), (+"Many With Minimum", Many_Min_Check'Access), (+"Followed_By", Followed_By_Check'Access), (+"Not_Followed_By", Not_Followed_By_Check'Access), (+"Many_Until No Minimum", Many_Until_Nomin_Check'Access), (+"Many_Until With Minimum", Many_Until_Min_Check'Access), (+"Satisfy", Satisfy_Check'Access), (+"Satisfy_With", Satisfy_With_Check'Access), (+"Match", Match_Check'Access), (+"Match_With", Match_With_Check'Access), (+"Multimatch", Multimatch_Check'Access), (+"Take", Take_Check'Access), (+"Take_While", Take_While_Check'Access), (+"Take_Until", Take_Until_Check'Access), (+"Empty", Empty_Check'Access), (+"Not_Empty", Not_Empty_Check'Access)); function Parse_Once_Check return Test_Result; function Parse_Once_Exception_Check return Test_Result; Parser_Tests : Test_Array := ((+"Parse_Once", Parse_Once_Check'Access), (+"Parse_Once Exception", Parse_Once_Exception_Check'Access)); function Default_Result_Check return Test_Result; function Left_Recursion_Check return Test_Result; Other_Tests : Test_Array := ((+"Default Combinator Result", Default_Result_Check'Access), (+"Left Recursion", Left_Recursion_Check'Access)); private type Parser_Labels_One is (One, Two, Three, Four, Five, Six); package Pone is new Packrat.No_Lex (Parser_Labels_One, Character, String); package One_Debug is new Pone.Parsers.Debug; function Match_AB is new Pone.Parsers.Multimatch ("ab"); function Match_CDE is new Pone.Parsers.Multimatch ("cde"); function Match_FG is new Pone.Parsers.Multimatch ("fg"); function Seq_ABCDEFG is new Pone.Parsers.Sequence ((Match_AB'Access, Match_CDE'Access, Match_FG'Access)); function Match_C is new Pone.Parsers.Match ('c'); function Many_C is new Pone.Parsers.Many (Match_C, 1); function Match_CC is new Pone.Parsers.Multimatch ("cc"); function Match_CCCDE is new Pone.Parsers.Multimatch ("cccde"); function Choose_CCCDE is new Pone.Parsers.Choice ((Many_C'Access, Match_CC'Access, Match_CCCDE'Access)); type Add_Sub_Labels is (Sum, Number); package Left_Sums is new Packrat.No_Lex (Add_Sub_Labels, Character, String); package Sum_Redir is new Left_Sums.Parsers.Redirect; function Sat_Digit is new Left_Sums.Parsers.Satisfy (Packrat.Utilities.Is_Digit); function Factor is new Left_Sums.Parsers.Stamp (Number, Sat_Digit); function Match_Plus is new Left_Sums.Parsers.Match ('+'); function Match_Minus is new Left_Sums.Parsers.Match ('-'); function Sum_Plus is new Left_Sums.Parsers.Sequence ((Sum_Redir.Call'Access, Match_Plus'Access, Factor'Access)); function Sum_Minus is new Left_Sums.Parsers.Sequence ((Sum_Redir.Call'Access, Match_Minus'Access, Factor'Access)); function Sum_Choice is new Left_Sums.Parsers.Choice ((Sum_Plus'Access, Sum_Minus'Access, Factor'Access)); function Sum is new Left_Sums.Parsers.Stamp (Sum, Sum_Choice); function Sum_Expr is new Left_Sums.Parsers.Sequence_2 (Sum, Left_Sums.Parsers.End_Of_Input); package Sum_Parse_Once is new Left_Sums.Parsers.Parse_Once (Sum_Expr); package Add_Redir is new Left_Sums.Parsers.Redirect; function Add_Plus is new Left_Sums.Parsers.Sequence ((Add_Redir.Call'Access, Match_Plus'Access, Factor'Access)); function Add_Choice is new Left_Sums.Parsers.Choice_2 (Add_Plus, Factor); function Add is new Left_Sums.Parsers.Stamp (Sum, Add_Choice); function Add_Expr is new Left_Sums.Parsers.Sequence_2 (Add, Left_Sums.Parsers.End_Of_Input); package Add_Parse_Once is new Left_Sums.Parsers.Parse_Once (Add_Expr); type Add_Error_Labels is (Sum_Err, Plus_Err, Number_Err, Eof_Err); package Add_Errors is new Packrat.No_Lex (Add_Error_Labels, Character, String); package Adder_Redir is new Add_Errors.Parsers.Redirect; function Sater_Digit is new Add_Errors.Parsers.Satisfy (Packrat.Utilities.Is_Digit); function Stamper_Number is new Add_Errors.Parsers.Stamp (Number_Err, Sater_Digit); function Matcher_Plus is new Add_Errors.Parsers.Match ('+'); function Stamper_Plus is new Add_Errors.Parsers.Stamp (Plus_Err, Matcher_Plus); function Ignorer_Plus is new Add_Errors.Parsers.Ignore (Stamper_Plus); function Sumer_Plus is new Add_Errors.Parsers.Sequence ((Adder_Redir.Call'Access, Ignorer_Plus'Access, Stamper_Number'Access)); function Sumer_Choice is new Add_Errors.Parsers.Choice ((Sumer_Plus'Access, Stamper_Number'Access)); function Sumer is new Add_Errors.Parsers.Stamp (Sum_Err, Sumer_Choice); function Stamper_End is new Add_Errors.Parsers.Stamp (Eof_Err, Add_Errors.Parsers.End_Of_Input); function Ignorer_End is new Add_Errors.Parsers.Ignore (Stamper_End); function Sumer_Expr is new Add_Errors.Parsers.Sequence_2 (Sumer, Ignorer_End); package Adder_Parse_Once is new Add_Errors.Parsers.Parse_Once (Sumer_Expr); function Alphanum_Switch (Char : in Character) return Character; end Rat_Tests.Parsers;