progs/comb1.scala
changeset 458 896a5f91838d
parent 367 04127a5aad23
child 461 890188804fb4
equal deleted inserted replaced
457:921fdd17d2b8 458:896a5f91838d
     3 
     3 
     4 /* Note, in the lectures I did not show the type consraint
     4 /* Note, in the lectures I did not show the type consraint
     5  * I <% Seq[_] , which means that the input type I can be
     5  * I <% Seq[_] , which means that the input type I can be
     6  * treated, or seen, as a sequence. */
     6  * treated, or seen, as a sequence. */
     7 
     7 
     8 abstract class Parser[I <% Seq[_], T] {
     8 trait Input { 
     9   def parse(ts: I): Set[(T, I)]
     9   def isEmpty: Boolean
       
    10 }
    10 
    11 
    11   def parse_all(ts: I) : Set[T] =
    12 
       
    13 abstract class Parser[T] {
       
    14 
       
    15   def parse(ts: Input): Set[(T, Input)]
       
    16 
       
    17   def parse_all(ts: Input) : Set[T] =
    12     for ((head, tail) <- parse(ts); 
    18     for ((head, tail) <- parse(ts); 
    13         if (tail.isEmpty)) yield head
    19         if (tail.isEmpty)) yield head
    14 }
    20 }
    15 
    21 
    16 class SeqParser[I <% Seq[_], T, S](p: => Parser[I, T], 
    22 class SeqParser[T, S](p: => Parser[T], 
    17                                    q: => Parser[I, S]) extends Parser[I, (T, S)] {
    23                       q: => Parser[S]) extends Parser[(T, S)] {
    18   def parse(sb: I) = 
    24   def parse(sb: Input) = 
    19     for ((head1, tail1) <- p.parse(sb); 
    25     for ((head1, tail1) <- p.parse(sb); 
    20          (head2, tail2) <- q.parse(tail1)) yield ((head1, head2), tail2)
    26          (head2, tail2) <- q.parse(tail1)) yield ((head1, head2), tail2)
    21 }
    27 }
    22 
    28 
    23 class AltParser[I <% Seq[_], T](p: => Parser[I, T], 
    29 class AltParser[T](p: => Parser[T], 
    24                                 q: => Parser[I, T]) extends Parser[I, T] {
    30                    q: => Parser[T]) extends Parser[T] {
    25   def parse(sb: I) = p.parse(sb) ++ q.parse(sb)   
    31   def parse(sb: Input) = p.parse(sb) ++ q.parse(sb)   
    26 }
    32 }
    27 
    33 
    28 class FunParser[I <% Seq[_], T, S](p: => Parser[I, T], 
    34 class FunParser[T, S](p: => Parser[T], 
    29                                    f: T => S) extends Parser[I, S] {
    35                       f: T => S) extends Parser[S] {
    30   def parse(sb: I) = 
    36   def parse(sb: Input) = 
    31     for ((head, tail) <- p.parse(sb)) yield (f(head), tail)
    37     for ((head, tail) <- p.parse(sb)) yield (f(head), tail)
    32 }
    38 }
    33 
    39 
    34 // atomic parsers  
    40 // atomic parsers  
    35 case class CharParser(c: Char) extends Parser[String, Char] {
    41 case class CharParser(c: Char) extends Parser[Char] {
       
    42   type Input = String
       
    43 
    36   def parse(sb: String) = 
    44   def parse(sb: String) = 
    37     if (sb.head == c) Set((c, sb.tail)) else Set()
    45     if (sb.head == c) Set((c, sb.tail)) else Set()
    38 }
    46 }
    39 
    47 
    40 case class StringParser(s: String) extends Parser[String, String] {
    48 case class StringParser(s: String) extends Parser[String, String] {