From 11f3f26e877210b88f1cadfe2c26d67b4530039c Mon Sep 17 00:00:00 2001 From: Jed Barber Date: Wed, 9 Jan 2019 14:43:25 +1100 Subject: Packrat.Errors functionality complete and tested --- src/packrat-errors-parts.adb | 95 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 src/packrat-errors-parts.adb (limited to 'src/packrat-errors-parts.adb') diff --git a/src/packrat-errors-parts.adb b/src/packrat-errors-parts.adb new file mode 100644 index 0000000..5ad3482 --- /dev/null +++ b/src/packrat-errors-parts.adb @@ -0,0 +1,95 @@ + + +with + + Ada.Strings.Fixed, + Ada.Strings.Maps; + +use type + + Ada.Strings.Maps.Character_Set; + + +separate (Packrat.Errors) +package body Parts is + + + package Str renames Ada.Strings; + package Fix renames Ada.Strings.Fixed; + package Map renames Ada.Strings.Maps; + + + ID_Start, ID_Finish : Positive := 1; + Pos_Start, Pos_Finish : Positive := 1; + Error_Count : Natural := Fix.Count (Message, Map.To_Set ('s')); + + + Letter_Range : Map.Character_Range := ('A', 'Z'); + Digit_Range : Map.Character_Range := ('0', '9'); + ID_Set : Map.Character_Set := Map.To_Set (Letter_Range) or Map.To_Set ('_'); + Pos_Set : Map.Character_Set := Map.To_Set (Digit_Range); + + + function Length + return Natural is + begin + return Error_Count; + end Length; + + + procedure Reset_Position is + begin + ID_Start := 1; + ID_Finish := 1; + Pos_Start := 1; + Pos_Finish := 1; + end Reset_Position; + + + procedure Set_Position + (To : in Positive) is + begin + ID_Start := To; + ID_Finish := To; + Pos_Start := To; + Pos_Finish := To; + end Set_Position; + + + procedure Next_ID_Token + (Start : out Positive; + Finish : out Natural) is + begin + Fix.Find_Token (Message, ID_Set, Pos_Finish, Str.Inside, ID_Start, ID_Finish); + Start := ID_Start; + Finish := ID_Finish; + Pos_Finish := ID_Finish; + end Next_ID_Token; + + + procedure Next_Pos_Token + (Start : out Positive; + Finish : out Natural) is + begin + Fix.Find_Token (Message, Pos_Set, ID_Finish, Str.Inside, Pos_Start, Pos_Finish); + Start := Pos_Start; + Finish := Pos_Finish; + ID_Finish := Pos_Finish; + end Next_Pos_Token; + + + procedure Next_Full_Token + (Start : out Positive; + Finish : out Natural) + is + Dummy : Natural; + begin + Next_ID_Token (Start, Dummy); + Next_Pos_Token (Dummy, Finish); + Start := Start - 1; + end Next_Full_Token; + + +end Parts; + + -- cgit