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))) |