101 case ALTS(rs) => rs.map(string).mkString("[", "|", "]") |
101 case ALTS(rs) => rs.map(string).mkString("[", "|", "]") |
102 case SEQ(r1, r2) => s"(${string(r1)} ~ ${string(r2)})" |
102 case SEQ(r1, r2) => s"(${string(r1)} ~ ${string(r2)})" |
103 case STAR(r) => s"{${string(r)}}*" |
103 case STAR(r) => s"{${string(r)}}*" |
104 case RECD(x, r) => s"(${x}! ${string(r)})" |
104 case RECD(x, r) => s"(${x}! ${string(r)})" |
105 } |
105 } |
|
106 |
|
107 def strings(rs: Set[Rexp]): String = |
|
108 rs.map(string).mkString("{", "|", "}") |
106 |
109 |
107 // string of an annotated regular expressions - for testing purposes |
110 // string of an annotated regular expressions - for testing purposes |
108 |
111 |
109 def astring(a: ARexp): String = a match { |
112 def astring(a: ARexp): String = a match { |
110 case AZERO => "0" |
113 case AZERO => "0" |
433 def bsimp(r: ARexp): ARexp = r match { |
436 def bsimp(r: ARexp): ARexp = r match { |
434 case ASEQ(bs1, r1, r2) => (bsimp(r1), bsimp(r2)) match { |
437 case ASEQ(bs1, r1, r2) => (bsimp(r1), bsimp(r2)) match { |
435 case (AZERO, _) => AZERO |
438 case (AZERO, _) => AZERO |
436 case (_, AZERO) => AZERO |
439 case (_, AZERO) => AZERO |
437 case (AONE(bs2), r2s) => fuse(bs1 ++ bs2, r2s) |
440 case (AONE(bs2), r2s) => fuse(bs1 ++ bs2, r2s) |
|
441 //case (AALTS(bs2, rs), r2s) => |
|
442 // AALTS(bs1 ++ bs2, rs.map(ASEQ(Nil, _, r2s))) |
438 case (r1s, r2s) => ASEQ(bs1, r1s, r2s) |
443 case (r1s, r2s) => ASEQ(bs1, r1s, r2s) |
439 } |
444 } |
440 case AALTS(bs1, rs) => distinctBy(flats(rs.map(bsimp)), erase) match { |
445 case AALTS(bs1, rs) => distinctBy(flats(rs.map(bsimp)), erase) match { |
441 case Nil => AZERO |
446 case Nil => AZERO |
442 case r :: Nil => fuse(bs1, r) |
447 case r :: Nil => fuse(bs1, r) |
472 def bsimp_full(r: ARexp): ARexp = r match { |
477 def bsimp_full(r: ARexp): ARexp = r match { |
473 case ASEQ(bs1, r1, r2) => (bsimp_full(r1), bsimp_full(r2)) match { |
478 case ASEQ(bs1, r1, r2) => (bsimp_full(r1), bsimp_full(r2)) match { |
474 case (AZERO, _) => AZERO |
479 case (AZERO, _) => AZERO |
475 case (_, AZERO) => AZERO |
480 case (_, AZERO) => AZERO |
476 case (AONE(bs2), r2s) => fuse(bs1 ++ bs2, r2s) |
481 case (AONE(bs2), r2s) => fuse(bs1 ++ bs2, r2s) |
|
482 //case (AALTS(bs2, rs), r2s) => |
|
483 // AALTS(bs1 ++ bs2, rs.map(ASEQ(Nil, _, r2s))) |
477 case (r1s, r2s) => ASEQ(bs1, r1s, r2s) |
484 case (r1s, r2s) => ASEQ(bs1, r1s, r2s) |
478 } |
485 } |
479 case AALTS(bs1, rs) => distinctBy(flats(rs.map(bsimp_full)), erase) match { |
486 case AALTS(bs1, rs) => distinctBy(flats(rs.map(bsimp_full)), erase) match { |
480 case Nil => AZERO |
487 case Nil => AZERO |
481 case r :: Nil => fuse(bs1, r) |
488 case r :: Nil => fuse(bs1, r) |
672 // Some Small Tests |
679 // Some Small Tests |
673 //================== |
680 //================== |
674 |
681 |
675 println("Small tests") |
682 println("Small tests") |
676 |
683 |
677 val q = STAR(STAR("bb" | "ab")) |
684 val q = STAR(STAR("bb" | ("a" | "b"))) |
678 val qs = "bbb" |
685 val qs = "bb" |
679 |
686 |
680 println("Size Bit " + asize(bders_simp(qs.toList, internalise(q)))) |
687 println("Size Bit " + asize(bders_simp(qs.toList, internalise(q)))) |
681 println("Size Bitf " + asize(bders_simp_full(qs.toList, internalise(q)))) |
688 println("Size Bitf " + asize(bders_simp_full(qs.toList, internalise(q)))) |
682 println("Size Bit2 " + asize(bders2_simp(qs.toList, internalise(q)))) |
689 println("Size Bit2 " + asize(bders2_simp(qs.toList, internalise(q)))) |
683 println("Size Old " + size(ders_simp(qs.toList, q))) |
690 println("Size Old " + size(ders_simp(qs.toList, q))) |
684 println("Size Pder " + psize(pders_simp(qs.toList, q))) |
691 println("Size Pder " + psize(pders(qs.toList, q))) |
685 |
692 println("Size Pder simp " + psize(pders_simp(qs.toList, q))) |
|
693 |
|
694 println(astring(bders_simp(qs.toList, internalise(q)))) |
|
695 println(astring(bders_simp_full(qs.toList, internalise(q)))) |
|
696 println(string(ders_simp(qs.toList, q))) |
|
697 println(strings(pders(qs.toList, q))) |
|
698 println(strings(pders_simp(qs.toList, q))) |
|
699 |
|
700 System.exit(0) |
686 |
701 |
687 val re1 = STAR("a" | "aa") |
702 val re1 = STAR("a" | "aa") |
688 println(astring(bders_simp("".toList, internalise(re1)))) |
703 println(astring(bders_simp("".toList, internalise(re1)))) |
689 println(astring(bders_simp("a".toList, internalise(re1)))) |
704 println(astring(bders_simp("a".toList, internalise(re1)))) |
690 println(astring(bders_simp("aa".toList, internalise(re1)))) |
705 println(astring(bders_simp("aa".toList, internalise(re1)))) |