Skip to content

Commit 68254e8

Browse files
committed
Boyer-Moore algorithm
Second of three pattern search algorithms.
1 parent 0a8699e commit 68254e8

File tree

4 files changed

+71
-5
lines changed

4 files changed

+71
-5
lines changed

Pattern_Search/DFA_Test.adb

+11-4
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,25 @@
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+
24

35
procedure DFA_Test is
46
Text : String := "this is a test string";
57
Pattern : String := "test";
68
N : Positive;
79
begin
8-
N := Search(Text => Text, Pattern => Pattern);
9-
1010
Put_Line(Text);
11-
11+
12+
N := Pattern_Search_KMP.Search(Text => Text, Pattern => Pattern);
1213
for I in 1 .. N
1314
loop
1415
Put(' ');
1516
end loop;
17+
Put_Line(Pattern);
1618

19+
N := Pattern_Search_BM.Search(Text => Text, Pattern => Pattern);
20+
for I in 1 .. N
21+
loop
22+
Put(' ');
23+
end loop;
1724
Put_Line(Pattern);
1825
end DFA_Test;

Pattern_Search/Pattern_Search_BM.adb

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
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;

Pattern_Search/Pattern_Search_BM.ads

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
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;

Pattern_Search/Pattern_Search_KMP.adb

-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
with Ada.Text_IO; use Ada.Text_IO;
21

32
package body Pattern_Search_KMP is
43
function Search (Text, Pattern : in String) return Positive is

0 commit comments

Comments
 (0)