blob: f13a675cf78e6a6e34cd42f3e2e3f26a54f7800d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
package body Packrat.Lexer.Debug is
function Create_Result
(Length : in Natural;
Status : in Result_Status;
Value : in Element_Array)
return Combinator_Result
is
This : Combinator_Result;
begin
This.Length := Length;
This.Status := Status;
This.Value := new Element_Array (1 .. Value'Length);
This.Value.all := Value;
return This;
end Create_Result;
function Join
(Left, Right : in Combinator_Result)
return Combinator_Result
is
Merge : Combinator_Result;
Left_Valsize, Right_Valsize, Total_Valsize : Natural;
begin
if Left.Value /= null then
Left_Valsize := Left.Value.all'Length;
else
Left_Valsize := 0;
end if;
if Right.Value /= null then
Right_Valsize := Right.Value.all'Length;
else
Right_Valsize := 0;
end if;
Total_Valsize := Left_Valsize + Right_Valsize;
if Left.Status = Success or Left.Status = Optional_More then
Merge.Length := Left.Length + Right.Length;
Merge.Status := Right.Status;
if Total_Valsize > 0 then
Merge.Value := new Element_Array (1 .. Total_Valsize);
if Left.Value /= null then
Merge.Value.all (1 .. Left_Valsize) := Left.Value.all;
end if;
if Right.Value /= null then
Merge.Value.all (Left_Valsize + 1 .. Total_Valsize) := Right.Value.all;
end if;
end if;
return Merge;
elsif Left.Status = Needs_More then
Merge := Left;
Merge.Status := Failure;
return Merge;
else
return Left;
end if;
end Join;
function Status
(This : in Combinator_Result)
return Result_Status is
begin
return This.Status;
end Status;
function Debug_String
(This : in Combinator_Result)
return String
is
Value_Length : Natural;
begin
if This.Value = null then
Value_Length := 0;
else
Value_Length := This.Value.all'Length;
end if;
return Integer'Image (This.Length)
& " " & Result_Status'Image (This.Status)
& " " & Integer'Image (Value_Length);
end Debug_String;
function So_Far
(This : in Lexer_Context)
return Token_Vector is
begin
return (This.Result_So_Far with null record);
end So_Far;
function Position
(This : in Lexer_Context)
return Positive is
begin
return This.Position;
end Position;
function Status
(This : in Lexer_Context)
return Result_Status is
begin
return This.Status;
end Status;
function Pass
(This : in Lexer_Context)
return access Element_Array is
begin
return This.Pass_Forward;
end Pass;
end Packrat.Lexer.Debug;
|