-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathRegEx.hs
More file actions
67 lines (51 loc) · 1.48 KB
/
Copy pathRegEx.hs
File metadata and controls
67 lines (51 loc) · 1.48 KB
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
module RegEx where
import Prelude hiding (seq)
data RegEx c = Null
| Eps
| Sym (c -> Bool)
| Alt (RegEx c) (RegEx c)
| Seq (RegEx c) (RegEx c)
| Star (RegEx c)
notNull :: RegEx c -> Bool
notNull Null = False
notNull _ = True
word :: String -> RegEx Char
word s = foldr seq Eps (map symC s)
symC :: (Eq c) => c -> RegEx c
symC c = Sym (==c)
alt :: RegEx c -> RegEx c -> RegEx c
alt Null r = r
alt r Null = r
alt r1 r2 = Alt r1 r2
seq :: RegEx c -> RegEx c -> RegEx c
seq Null _ = Null
seq _ Null = Null
seq Eps r = r
seq r Eps = r
seq r1 r2 = Seq r1 r2
star :: RegEx c -> RegEx c
star Null = Eps
-- don't know if the following is true or not??
-- star Eps = Eps
star r = Star r
empty :: RegEx c -> Bool
empty Null = False
empty Eps = True
empty (Sym _) = False
empty (Alt r1 r2) = empty r1 || empty r2
empty (Seq r1 r2) = empty r1 && empty r2
empty (Star _) = True
fromBool :: Bool -> RegEx c
fromBool True = Eps
fromBool False = Null
derivative :: c -> RegEx c -> RegEx c
derivative _ Null = Null
derivative _ Eps = Null
derivative c (Sym f) = if f c then Eps else Null
derivative c (Alt r1 r2) = alt (derivative c r1) (derivative c r2)
derivative c (Seq r1 r2) = alt (seq (fromBool $ empty r1) (derivative c r2))
(seq (derivative c r1) (r2))
derivative c (Star r) = seq (derivative c r) (star r)
match :: RegEx Char -> String -> Bool
match r [] = empty r
match r (c:cs) = match (derivative c r) cs