progs/lexer/lexer.sc
changeset 945 5070392a1bd7
parent 944 f5d2453c5640
child 947 dc31a099dc98
equal deleted inserted replaced
944:f5d2453c5640 945:5070392a1bd7
    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]