progs/lexer/lexer.sc
changeset 1020 36799f7b9702
parent 1010 adc61c55e165
equal deleted inserted replaced
1019:f71399fe3fdc 1020:36799f7b9702
    41   case c::s => SEQ(CHAR(c), charlist2rexp(s))
    41   case c::s => SEQ(CHAR(c), charlist2rexp(s))
    42 }
    42 }
    43 
    43 
    44 given Conversion[String, Rexp] = (s => charlist2rexp(s.toList))
    44 given Conversion[String, Rexp] = (s => charlist2rexp(s.toList))
    45 
    45 
    46 //extension (s: String) {
    46 
    47 //  def $ (r: Rexp) = RECD(s, r)
       
    48 //}
       
    49 extension (s: String) {
    47 extension (s: String) {
    50   def $ (r: Rexp) = RECD(s, r)
    48   def $ (r: Rexp) = RECD(s, r)
    51   def | (r: Rexp) = ALT(s, r)
    49   def | (r: Rexp) = ALT(s, r)
    52   def | (r: String) = ALT(s, r)
    50   def | (r: String) = ALT(s, r)
    53   def % = STAR(s)
    51   def % = STAR(s)
    79   case ALT(r1, r2) => ALT(der(c, r1), der(c, r2))
    77   case ALT(r1, r2) => ALT(der(c, r1), der(c, r2))
    80   case SEQ(r1, r2) => 
    78   case SEQ(r1, r2) => 
    81     if (nullable(r1)) ALT(SEQ(der(c, r1), r2), der(c, r2))
    79     if (nullable(r1)) ALT(SEQ(der(c, r1), r2), der(c, r2))
    82     else SEQ(der(c, r1), r2)
    80     else SEQ(der(c, r1), r2)
    83   case STAR(r) => SEQ(der(c, r), STAR(r))
    81   case STAR(r) => SEQ(der(c, r), STAR(r))
    84   case RECD(_, r1) => der(c, r1)
    82   case RECD(label, r1) => der(c, r1)
    85 }
    83 }
    86 
    84 
    87 // extracts a string from a value
    85 // extracts a string from a value
    88 def flatten(v: Val) : String = v match {
    86 def flatten(v: Val) : String = v match {
    89   case Empty => ""
    87   case Empty => ""