progs/comb1.scala
changeset 183 b17eff695c7f
parent 178 d36363d648e3
child 185 ea8b94d4755e
equal deleted inserted replaced
182:9ce2414e470e 183:b17eff695c7f
     2 import scala.language.reflectiveCalls
     2 import scala.language.reflectiveCalls
     3 
     3 
     4 abstract class Parser[I <% Seq[_], T] {
     4 abstract class Parser[I <% Seq[_], T] {
     5   def parse(ts: I): Set[(T, I)]
     5   def parse(ts: I): Set[(T, I)]
     6 
     6 
     7     aaa dcjefoivhwefihvefhiv def parse_all(ts: I) : Set[T] =
     7   def parse_all(ts: I) : Set[T] =
     8     for ((head, tail) <- parse(ts); if (tail.isEmpty)) yield head
     8     for ((head, tail) <- parse(ts); if (tail.isEmpty)) yield head
     9 }
     9 }
    10 
    10 
    11 class SeqParser[I <% Seq[_], T, S](p: => Parser[I, T], q: => Parser[I, S]) extends Parser[I, (T, S)] {
    11 class SeqParser[I <% Seq[_], T, S](p: => Parser[I, T], q: => Parser[I, S]) extends Parser[I, (T, S)] {
    12   def parse(sb: I) = 
    12   def parse(sb: I) = 
    21 class FunParser[I <% Seq[_], T, S](p: => Parser[I, T], f: T => S) extends Parser[I, S] {
    21 class FunParser[I <% Seq[_], T, S](p: => Parser[I, T], f: T => S) extends Parser[I, S] {
    22   def parse(sb: I) = 
    22   def parse(sb: I) = 
    23     for ((head, tail) <- p.parse(sb)) yield (f(head), tail)
    23     for ((head, tail) <- p.parse(sb)) yield (f(head), tail)
    24 }
    24 }
    25 
    25 
    26 // atomic parsers
    26 // atomic parsers  
    27 case class CharParser(c: Char) extends Parser[String, Char] {
    27 case class CharParser(c: Char) extends Parser[String, Char] {
    28   def parse(sb: String) = 
    28   def parse(sb: String) = 
    29     if (sb.head == c) Set((c, sb.tail)) else Set()
    29     if (sb.head == c) Set((c, sb.tail)) else Set()
    30 }
    30 }
    31 
    31