summaryrefslogtreecommitdiff
path: root/src/packrat-lexer.adb
diff options
context:
space:
mode:
Diffstat (limited to 'src/packrat-lexer.adb')
-rw-r--r--src/packrat-lexer.adb64
1 files changed, 38 insertions, 26 deletions
diff --git a/src/packrat-lexer.adb b/src/packrat-lexer.adb
index 319e05c..bd8d7ea 100644
--- a/src/packrat-lexer.adb
+++ b/src/packrat-lexer.adb
@@ -170,6 +170,36 @@ package body Packrat.Lexer is
end Token_Vector_To_Array;
+ function Slide
+ (Input : in Element_Array)
+ return Element_Array
+ is
+ subtype Slider is Element_Array (1 .. Input'Length);
+ begin
+ return Slider (Input);
+ end Slide;
+
+
+ procedure Internal_Scan_Core
+ (Input : in Element_Array;
+ Context : in out Lexer_Context;
+ Components : in Component_Array)
+ is
+ Raise_Error : Boolean;
+ begin
+ Raise_Error := True;
+ for C of Components loop
+ if C (Input, Context) = Component_Success then
+ Raise_Error := False;
+ exit;
+ end if;
+ end loop;
+ if Raise_Error then
+ Raise_Lexer_Error (Context.Error_Labels, Context.Position);
+ end if;
+ end Internal_Scan_Core;
+
+
@@ -181,7 +211,7 @@ package body Packrat.Lexer is
Real_Input : Input_Holders.Holder;
begin
if not Context.Pass_Forward.Is_Empty then
- Real_Input.Replace_Element (Context.Pass_Forward.Element & Input);
+ Real_Input.Replace_Element (Slide (Context.Pass_Forward.Element) & Input);
else
Real_Input.Replace_Element (Input);
end if;
@@ -206,7 +236,7 @@ package body Packrat.Lexer is
Real_Input : Input_Holders.Holder;
begin
if not Context.Pass_Forward.Is_Empty then
- Real_Input.Replace_Element (Context.Pass_Forward.Element & Input);
+ Real_Input.Replace_Element (Slide (Context.Pass_Forward.Element) & Input);
else
Real_Input.Replace_Element (Input);
end if;
@@ -236,7 +266,8 @@ package body Packrat.Lexer is
Real_Input.Replace_Element (Input.all);
Empty_Input := Real_Input.Element'Length = 0;
if not Context.Pass_Forward.Is_Empty then
- Real_Input.Replace_Element (Context.Pass_Forward.Element & Real_Input.Element);
+ Real_Input.Replace_Element
+ (Slide (Context.Pass_Forward.Element) & Real_Input.Element);
end if;
Tidy_Context (Context, Components'Length);
@@ -262,7 +293,7 @@ package body Packrat.Lexer is
Real_Input : Input_Holders.Holder;
begin
if not Context.Pass_Forward.Is_Empty then
- Real_Input.Replace_Element (Context.Pass_Forward.Element & Input);
+ Real_Input.Replace_Element (Slide (Context.Pass_Forward.Element) & Input);
else
Real_Input.Replace_Element (Input);
end if;
@@ -298,10 +329,11 @@ package body Packrat.Lexer is
Context.Result_So_Far.Clear;
loop
Real_Input.Replace_Element (Input.all);
- Empty_Input := Real_Input.Element'Length = 0 or
+ Empty_Input := Real_Input.Element'Length = 0 or else
Real_Input.Element (Real_Input.Element'First) = Pad_In;
if not Context.Pass_Forward.Is_Empty then
- Real_Input.Replace_Element (Context.Pass_Forward.Element & Real_Input.Element);
+ Real_Input.Replace_Element
+ (Slide (Context.Pass_Forward.Element) & Real_Input.Element);
end if;
Tidy_Context (Context, Components'Length);
@@ -329,26 +361,6 @@ package body Packrat.Lexer is
end Scan_Set_With;
- procedure Internal_Scan_Core
- (Input : in Element_Array;
- Context : in out Lexer_Context;
- Components : in Component_Array)
- is
- Raise_Error : Boolean;
- begin
- Raise_Error := True;
- for C of Components loop
- if C (Input, Context) = Component_Success then
- Raise_Error := False;
- exit;
- end if;
- end loop;
- if Raise_Error then
- Raise_Lexer_Error (Context.Error_Labels, Context.Position);
- end if;
- end Internal_Scan_Core;
-
-