progs/scala/re-annotated2.sc
changeset 647 70c10dc41606
parent 645 304a12cdda6f
equal deleted inserted replaced
646:56057198e4f5 647:70c10dc41606
   209   case ASEQ(bs1, r1, r2) => (bsimp(r1), bsimp(r2)) match {
   209   case ASEQ(bs1, r1, r2) => (bsimp(r1), bsimp(r2)) match {
   210       case (AZERO, _) => AZERO
   210       case (AZERO, _) => AZERO
   211       case (_, AZERO) => AZERO
   211       case (_, AZERO) => AZERO
   212       case (AONE(bs2), r2s) => fuse(bs1 ++ bs2, r2s)
   212       case (AONE(bs2), r2s) => fuse(bs1 ++ bs2, r2s)
   213       // needed in order to keep the size down
   213       // needed in order to keep the size down
   214       case (AALTS(bs, rs), r2) => AALTS(bs1 ++ bs, rs.map(ASEQ(Nil, _, r2)))
   214       //case (AALTS(bs, rs), r2) => AALTS(bs1 ++ bs, rs.map(ASEQ(Nil, _, r2)))
   215       case (r1s, r2s) => ASEQ(bs1, r1s, r2s)
   215       case (r1s, r2s) => ASEQ(bs1, r1s, r2s)
   216   }
   216   }
   217   // distinctBy deletes copies of the same  "erased" regex
   217   // distinctBy deletes copies of the same  "erased" regex
   218   case AALTS(bs1, rs) => (flts(rs.map(bsimp))).distinctBy(erase) match {
   218   case AALTS(bs1, rs) => (flts(rs.map(bsimp))).distinctBy(erase) match {
   219       case Nil => AZERO
   219       case Nil => AZERO
   220       case r::Nil => fuse(bs1, r)
   220       case r::Nil => fuse(bs1, r)
   221       case rs => AALTS(bs1, rs)
   221       case rs => AALTS(bs1, rs)
   222   }
   222   }
   223   case r => r
   223   case r => r
       
   224 }
       
   225 
       
   226 def bders_simp(r: ARexp, s: List[Char]) : ARexp = s match {
       
   227   case Nil => r
       
   228   case c::cs => bders_simp(bsimp(bder(c, r)), cs)
   224 }
   229 }
   225 
   230 
   226 def blex_simp(r: ARexp, s: List[Char]) : Bits = s match {
   231 def blex_simp(r: ARexp, s: List[Char]) : Bits = s match {
   227   case Nil => if (bnullable(r)) bmkeps(r) 
   232   case Nil => if (bnullable(r)) bmkeps(r) 
   228               else throw new Exception("Not matched")
   233               else throw new Exception("Not matched")
   366 println(blexing_simp(WHILE_REGS, prog2).filter(s => s == "" || !s.startsWith("w")))
   371 println(blexing_simp(WHILE_REGS, prog2).filter(s => s == "" || !s.startsWith("w")))
   367 
   372 
   368 val n = 200
   373 val n = 200
   369 println(s"lexing fib program ($n times, size ${prog2.length * n})")
   374 println(s"lexing fib program ($n times, size ${prog2.length * n})")
   370 println(time_needed(1, blexing_simp(WHILE_REGS, prog2 * n)))
   375 println(time_needed(1, blexing_simp(WHILE_REGS, prog2 * n)))
       
   376 
       
   377 
       
   378 
       
   379 
       
   380 
       
   381 val reg2 = STAR("a" | "aa")
       
   382 
       
   383 println(bsize(bders_simp(internalise(reg2), ("a" * 0).toList)))
       
   384 println(bsize(bders_simp(internalise(reg2), ("a" * 1).toList)))
       
   385 println(bsize(bders_simp(internalise(reg2), ("a" * 2).toList)))
       
   386 println(bsize(bders_simp(internalise(reg2), ("a" * 3).toList)))
       
   387 println(bsize(bders_simp(internalise(reg2), ("a" * 4).toList)))
       
   388 println(bsize(bders_simp(internalise(reg2), ("a" * 50000).toList)))