262
Christian Urban <christian dot urban at kcl dot ac dot uk>
diff
changeset
|
1 |
def simp(r: Rexp): Rexp = r match {
|
Christian Urban <christian dot urban at kcl dot ac dot uk>
diff
changeset
|
2 |
case ALT(r1, r2) => {
|
Christian Urban <christian dot urban at kcl dot ac dot uk>
diff
changeset
|
3 |
val r1s = simp(r1)
|
Christian Urban <christian dot urban at kcl dot ac dot uk>
diff
changeset
|
4 |
val r2s = simp(r2)
|
Christian Urban <christian dot urban at kcl dot ac dot uk>
diff
changeset
|
5 |
(r1s, r2s) match {
|
Christian Urban <christian dot urban at kcl dot ac dot uk>
diff
changeset
|
6 |
case (NULL, _) => r2s
|
Christian Urban <christian dot urban at kcl dot ac dot uk>
diff
changeset
|
7 |
case (_, NULL) => r1s
|
Christian Urban <christian dot urban at kcl dot ac dot uk>
diff
changeset
|
8 |
case _ => if (r1s == r2s) r1s else ALT(r1s, r2s)
|
Christian Urban <christian dot urban at kcl dot ac dot uk>
diff
changeset
|
9 |
}
|
Christian Urban <christian dot urban at kcl dot ac dot uk>
diff
changeset
|
10 |
}
|
Christian Urban <christian dot urban at kcl dot ac dot uk>
diff
changeset
|
11 |
case SEQ(r1, r2) => {
|
Christian Urban <christian dot urban at kcl dot ac dot uk>
diff
changeset
|
12 |
val r1s = simp(r1)
|
Christian Urban <christian dot urban at kcl dot ac dot uk>
diff
changeset
|
13 |
val r2s = simp(r2)
|
Christian Urban <christian dot urban at kcl dot ac dot uk>
diff
changeset
|
14 |
(r1s, r2s) match {
|
Christian Urban <christian dot urban at kcl dot ac dot uk>
diff
changeset
|
15 |
case (NULL, _) => NULL
|
Christian Urban <christian dot urban at kcl dot ac dot uk>
diff
changeset
|
16 |
case (_, NULL) => NULL
|
Christian Urban <christian dot urban at kcl dot ac dot uk>
diff
changeset
|
17 |
case (EMPTY, _) => r2s
|
Christian Urban <christian dot urban at kcl dot ac dot uk>
diff
changeset
|
18 |
case (_, EMPTY) => r1s
|
Christian Urban <christian dot urban at kcl dot ac dot uk>
diff
changeset
|
19 |
case _ => SEQ(r1s, r2s)
|
Christian Urban <christian dot urban at kcl dot ac dot uk>
diff
changeset
|
20 |
}
|
Christian Urban <christian dot urban at kcl dot ac dot uk>
diff
changeset
|
21 |
}
|
Christian Urban <christian dot urban at kcl dot ac dot uk>
diff
changeset
|
22 |
case NTIMES(r, n) => NTIMES(simp(r), n)
|
Christian Urban <christian dot urban at kcl dot ac dot uk>
diff
changeset
|
23 |
case r => r
|
7
|
24 |
}
|
|
25 |
|
117
Christian Urban <christian dot urban at kcl dot ac dot uk>
diff
changeset
|
26 |
def ders (s: List[Char], r: Rexp) : Rexp = s match {
|
Christian Urban <christian dot urban at kcl dot ac dot uk>
diff
changeset
|
27 |
case Nil => r
|
262
Christian Urban <christian dot urban at kcl dot ac dot uk>
diff
changeset
|
28 |
case c::s => ders(s, simp(der(c, r)))
|
117
Christian Urban <christian dot urban at kcl dot ac dot uk>
diff
changeset
|
29 |
}
|
Christian Urban <christian dot urban at kcl dot ac dot uk>
diff
changeset
|
30 |
|