summaryrefslogtreecommitdiff
path: root/test/rat_tests-parsers.ads
diff options
context:
space:
mode:
Diffstat (limited to 'test/rat_tests-parsers.ads')
-rw-r--r--test/rat_tests-parsers.ads85
1 files changed, 82 insertions, 3 deletions
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;