From dd9121ec8d91784e6cea4e71cd1fe5c3735d81d8 Mon Sep 17 00:00:00 2001 From: Jed Barber Date: Fri, 25 Dec 2020 22:13:59 +1100 Subject: Parser tests, left recursion test --- test/rat_tests-parsers.ads | 85 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 82 insertions(+), 3 deletions(-) (limited to 'test/rat_tests-parsers.ads') diff --git a/test/rat_tests-parsers.ads b/test/rat_tests-parsers.ads index 5a2d15f..198b622 100644 --- a/test/rat_tests-parsers.ads +++ b/test/rat_tests-parsers.ads @@ -14,6 +14,7 @@ use private with Packrat.No_Lex, + Packrat.Utilities, Packrat.Parsers.Debug, Packrat.Errors, Packrat.Traits; @@ -71,10 +72,20 @@ package Rat_Tests.Parsers is (+"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 := - (1 => (+"Default Combinator Result", Default_Result_Check'Access)); + ((+"Default Combinator Result", Default_Result_Check'Access), + (+"Left Recursion", Left_Recursion_Check'Access)); private @@ -88,8 +99,6 @@ private 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"); @@ -106,6 +115,76 @@ private + 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; -- cgit