198 @arg(doc = "Tests that show not all is hunky-dory, but a solution leads too far afield.") |
198 @arg(doc = "Tests that show not all is hunky-dory, but a solution leads too far afield.") |
199 @main |
199 @main |
200 def fail() = { test3(); test4(); test5() } |
200 def fail() = { test3(); test4(); test5() } |
201 |
201 |
202 |
202 |
|
203 // simplification |
|
204 def simp2(r: Rexp) : Rexp = r match { |
|
205 case ALT(r1, r2) => (simp2(r1), simp2(r2)) match { |
|
206 case (ZERO, r2s) => r2s |
|
207 case (r1s, ZERO) => r1s |
|
208 //case (r1s, r2s) => if (r1s == r2s) r1s else ALT (r1s, r2s) |
|
209 case (r1s, r2s) => ALT(r1s, r2s) |
|
210 } |
|
211 case SEQ(r1, r2) => (simp2(r1), simp2(r2)) match { |
|
212 case (ZERO, _) => ZERO |
|
213 case (_, ZERO) => ZERO |
|
214 //case (ONE, r2s) => r2s |
|
215 //case (r1s, ONE) => r1s |
|
216 case (r1s, r2s) => SEQ(r1s, r2s) |
|
217 } |
|
218 case r => r |
|
219 } |
|
220 |
|
221 // some convenience for typing in regular expressions |
|
222 import scala.language.implicitConversions |
|
223 |
|
224 def charlist2rexp(s : List[Char]): Rexp = s match { |
|
225 case Nil => ONE |
|
226 case c::Nil => CHAR(c) |
|
227 case c::s => SEQ(CHAR(c), charlist2rexp(s)) |
|
228 } |
|
229 |
|
230 given Conversion[String, Rexp] = (s => charlist2rexp(s.toList)) |
|
231 |
|
232 val HELLO : Rexp = "hello" |
|
233 |
|
234 extension (r: Rexp) { |
|
235 def | (s: Rexp) = ALT(r, s) |
|
236 def % = STAR(r) |
|
237 def ~ (s: Rexp) = SEQ(r, s) |
|
238 } |
|
239 |
|
240 val re = (ONE | "a" | "ab") ~ ("c" | "bc") ~ ("d" | "e") |
|
241 simp2(der('d', der('c', der('b', der('a', re))))) |