diff -r b528d1d3d3c3 -r 59e005dcf163 main_solution3/re.scala --- a/main_solution3/re.scala Thu Nov 02 13:53:37 2023 +0000 +++ b/main_solution3/re.scala Thu Nov 02 23:34:53 2023 +0000 @@ -3,7 +3,6 @@ object M3 { -// Regular Expressions abstract class Rexp case object ZERO extends Rexp case object ONE extends Rexp @@ -18,30 +17,38 @@ def ALT(r1: Rexp, r2: Rexp) = ALTs(List(r1, r2)) def SEQ(r1: Rexp, r2: Rexp) = SEQs(List(r1, r2)) -// some convenience for typing in regular expressions -import scala.language.implicitConversions -import scala.language.reflectiveCalls + +// some convenience for typing regular expressions def charlist2rexp(s: List[Char]): Rexp = s match { case Nil => ONE case c::Nil => CHAR(c) case c::s => SEQ(CHAR(c), charlist2rexp(s)) } -implicit def string2rexp(s: String): Rexp = charlist2rexp(s.toList) + +import scala.language.implicitConversions -implicit def RexpOps (r: Rexp) = new { +given Conversion[String, Rexp] = (s => charlist2rexp(s.toList)) + +extension (r: Rexp) { def | (s: Rexp) = ALT(r, s) def % = STAR(r) def ~ (s: Rexp) = SEQ(r, s) } -implicit def stringOps (s: String) = new { - def | (r: Rexp) = ALT(s, r) - def | (r: String) = ALT(s, r) - def % = STAR(s) - def ~ (r: Rexp) = SEQ(s, r) - def ~ (r: String) = SEQ(s, r) -} +// some examples for the conversion and extension: + +// val areg : Rexp = "a" | "b" +// => ALTs(List(CHAR('a'), CHAR('b'))) +// +// val sreg : Rexp = "a" ~ "b" +// => SEQs(List(CHAR('a'), CHAR('b'))) +// +// val star_reg : Rexp = ("a" ~ "b").% +// => STAR(SEQs(List(CHAR('a'), CHAR('b')))) + +// ADD YOUR CODE BELOW +//====================== // (1) def nullable (r: Rexp) : Boolean = r match { @@ -194,8 +201,9 @@ -/* -// if nullable(r1) - ALTs(SEQs(der(c, r1)::rs)::(rs filter what is nullable) .map(der(c,_))) -*/ +// This template code is subject to copyright +// by King's College London, 2022. Do not +// make the template code public in any shape +// or form, and do not exchange it with other +// students under any circumstance.