File tree 4 files changed +71
-5
lines changed
4 files changed +71
-5
lines changed Original file line number Diff line number Diff line change 1
- with Ada.Text_IO, Pattern_Search; use Ada.Text_IO, Pattern_Search;
1
+ with Ada.Text_IO ; use Ada.Text_IO;
2
+ with Pattern_Search_KMP, Pattern_Search_BM;
3
+
2
4
3
5
procedure DFA_Test is
4
6
Text : String := " this is a test string" ;
5
7
Pattern : String := " test" ;
6
8
N : Positive;
7
9
begin
8
- N := Search(Text => Text, Pattern => Pattern);
9
-
10
10
Put_Line(Text);
11
-
11
+
12
+ N := Pattern_Search_KMP.Search(Text => Text, Pattern => Pattern);
12
13
for I in 1 .. N
13
14
loop
14
15
Put(' ' );
15
16
end loop ;
17
+ Put_Line(Pattern);
16
18
19
+ N := Pattern_Search_BM.Search(Text => Text, Pattern => Pattern);
20
+ for I in 1 .. N
21
+ loop
22
+ Put(' ' );
23
+ end loop ;
17
24
Put_Line(Pattern);
18
25
end DFA_Test ;
Original file line number Diff line number Diff line change
1
+
2
+ package body Pattern_Search_BM is
3
+ function Search (Text, Pattern : in String) return Positive is
4
+ Right_Array : Right(' ' .. ' ~' );
5
+ N : Positive := Text'Length;
6
+ M : Positive := Pattern'Length;
7
+ I : Positive := 1 ;
8
+ Skip : Integer;
9
+ begin
10
+ Build_Right(Right_Array, Pattern);
11
+
12
+ while I <= N-M
13
+ loop
14
+ Skip := 0 ;
15
+
16
+ for J in reverse 1 .. M
17
+ loop
18
+ if Pattern(J) /= Text(I+J-1 ) then
19
+ if J-Right_Array(Text(I+J-1 )) < 1 then
20
+ Skip := 1 ;
21
+ else
22
+ Skip := J-Right_Array(Text(I+J-1 ));
23
+ end if ;
24
+
25
+ exit ;
26
+ end if ;
27
+ end loop ;
28
+
29
+ if Skip = 0 then
30
+ return I - 1 ;
31
+ end if ;
32
+
33
+ I := I + Skip;
34
+ end loop ;
35
+
36
+ return N;
37
+ end Search ;
38
+
39
+ procedure Build_Right (Right_Array : in out Right; Pattern : in String) is
40
+ begin
41
+ for C in Right_Array'range
42
+ loop
43
+ Right_Array(C) := 0 ;
44
+ end loop ;
45
+
46
+ for I in Pattern'range
47
+ loop
48
+ Right_Array(Pattern(I)) := I;
49
+ end loop ;
50
+ end Build_Right ;
51
+ end Pattern_Search_BM ;
Original file line number Diff line number Diff line change
1
+
2
+ package Pattern_Search_BM is
3
+ -- accepts all printable ascii characters
4
+ type Right is array (Character range <>) of Integer;
5
+
6
+ function Search (Text, Pattern : in String) return Positive;
7
+ private
8
+ procedure Build_Right (Right_Array : in out Right; Pattern : in String);
9
+ end Pattern_Search_BM ;
Original file line number Diff line number Diff line change 1
- with Ada.Text_IO ; use Ada.Text_IO;
2
1
3
2
package body Pattern_Search_KMP is
4
3
function Search (Text, Pattern : in String) return Positive is
You can’t perform that action at this time.
0 commit comments