diff -r 352d15782d35 -r 71fc4a7a7039 progs/re4.scala --- a/progs/re4.scala Sat May 05 10:31:00 2018 +0100 +++ b/progs/re4.scala Fri Jun 01 15:28:37 2018 +0100 @@ -112,3 +112,50 @@ +// size of a regular expressions - for testing purposes +def size(r: Rexp) : Int = r match { + case ZERO => 1 + case ONE => 1 + case CHAR(_) => 1 + case ALT(r1, r2) => 1 + size(r1) + size(r2) + case SEQ(r1, r2) => 1 + size(r1) + size(r2) + case STAR(r) => 1 + size(r) + case NTIMES(r, _) => 1 + size(r) +} + + +// string of a regular expressions - for testing purposes +def string(r: Rexp) : String = r match { + case ZERO => "0" + case ONE => "1" + case CHAR(c) => c.toString + case ALT(r1, r2) => s"(${string(r1)} + ${string(r2)})" + case SEQ(CHAR(c), CHAR(d)) => s"${c}${d}" + case SEQ(r1, r2) => s"(${string(r1)} ~ ${string(r2)})" + case STAR(r) => s"(${string(r)})*" + case NTIMES(r, n) => s"(${string(r)}){${n}}" +} + + +// test: ("a" | "aa")* +val EVIL3 = STAR(ALT(CHAR('a'), SEQ(CHAR('a'), CHAR('a')))) + +//test: ("" | "a" | "aa")* +val EVIL3 = STAR(ALT(ONE, ALT(CHAR('a'), SEQ(CHAR('a'), CHAR('a'))))) + +val t1 = ders2("a".toList, EVIL3) +val t1s = simp(t1) +val t2 = ders2("aa".toList, t1s) +val t2s = simp(t2) +val t3 = ders2("aaa".toList, t2s) +val t3s = simp(t3) +val t4 = ders2("aaaa".toList, t3s) +val t4s = simp(t4) +println(string(t1) + " " + size(t1)) +println("s " + string(t1s) + " " + size(t1s)) +println(string(t2) + " " + size(t2)) +println("s " + string(t2s) + " " + size(t2s)) +println(string(t3) + " " + size(t3)) +println("s " + string(t3s) + " " + size(t3s)) +println(string(t4) + " " + size(t4)) +println("s " + string(t4s) + " " + size(t4s))