equal
deleted
inserted
replaced
57 def ~ (s: Rexp) = SEQ(r, s) |
57 def ~ (s: Rexp) = SEQ(r, s) |
58 } |
58 } |
59 |
59 |
60 |
60 |
61 |
61 |
62 val r : Rexp = ("a" | "b").% |
|
63 println(r) |
|
64 |
|
65 def nullable(r: Rexp) : Boolean = r match { |
62 def nullable(r: Rexp) : Boolean = r match { |
66 case ZERO => false |
63 case ZERO => false |
67 case ONE => true |
64 case ONE => true |
68 case CHAR(_) => false |
65 case CHAR(_) => false |
69 case ALT(r1, r2) => nullable(r1) || nullable(r2) |
66 case ALT(r1, r2) => nullable(r1) || nullable(r2) |
81 if (nullable(r1)) ALT(SEQ(der(c, r1), r2), der(c, r2)) |
78 if (nullable(r1)) ALT(SEQ(der(c, r1), r2), der(c, r2)) |
82 else SEQ(der(c, r1), r2) |
79 else SEQ(der(c, r1), r2) |
83 case STAR(r) => SEQ(der(c, r), STAR(r)) |
80 case STAR(r) => SEQ(der(c, r), STAR(r)) |
84 case RECD(_, r1) => der(c, r1) |
81 case RECD(_, r1) => der(c, r1) |
85 } |
82 } |
86 |
|
87 println(der('a', ALT(STAR("a"), "b"))) |
|
88 |
83 |
89 // extracts a string from a value |
84 // extracts a string from a value |
90 def flatten(v: Val) : String = v match { |
85 def flatten(v: Val) : String = v match { |
91 case Empty => "" |
86 case Empty => "" |
92 case Chr(c) => c.toString |
87 case Chr(c) => c.toString |
336 // |
331 // |
337 // scala.reflect.runtime.universe._ |
332 // scala.reflect.runtime.universe._ |
338 // |
333 // |
339 // which has been removed in Scala 3. |
334 // which has been removed in Scala 3. |
340 // |
335 // |
341 // for escaping strings in Scala 3 |
336 // for escaping strings in Scala 3 use this equivalent code |
|
337 |
342 import scala.quoted._ |
338 import scala.quoted._ |
343 |
339 |
344 def escapeImpl(raw: Expr[String])(using Quotes): Expr[String] = { |
340 def escapeImpl(raw: Expr[String])(using Quotes): Expr[String] = { |
345 import quotes.reflect.* |
341 import quotes.reflect.* |
346 Literal(StringConstant(raw.show)).asExprOf[String] |
342 Literal(StringConstant(raw.show)).asExprOf[String] |