progs/app8.scala
changeset 170 fa187fa5b642
parent 93 4794759139ea
equal deleted inserted replaced
169:57df3d7b4a25 170:fa187fa5b642
       
     1 class AltParser[I, T](p: => Parser[I, T], 
       
     2                       q: => Parser[I, T]) 
       
     3                           extends Parser[I, T] {
       
     4   def parse(sb: I) = p.parse(sb) ++ q.parse(sb)   
       
     5 }
       
     6 
     1 class SeqParser[I, T, S](p: => Parser[I, T], 
     7 class SeqParser[I, T, S](p: => Parser[I, T], 
     2                          q: => Parser[I, S]) 
     8                          q: => Parser[I, S]) 
     3                              extends Parser[I, (T, S)] {
     9                              extends Parser[I, (T, S)] {
     4   def parse(sb: I) = 
    10   def parse(sb: I) = 
     5     for ((head1, tail1) <- p.parse(sb); 
    11     for ((head1, tail1) <- p.parse(sb); 
     6          (head2, tail2) <- q.parse(tail1)) 
    12          (head2, tail2) <- q.parse(tail1)) 
     7             yield ((head1, head2), tail2)
    13             yield ((head1, head2), tail2)
     8 }
    14 }
     9 
    15 
    10 class AltParser[I, T](p: => Parser[I, T], 
       
    11                       q: => Parser[I, T]) 
       
    12                           extends Parser[I, T] {
       
    13   def parse(sb: I) = p.parse(sb) ++ q.parse(sb)   
       
    14 }
       
    15 
       
    16 class FunParser[I, T, S](p: => Parser[I, T], f: T => S) 
    16 class FunParser[I, T, S](p: => Parser[I, T], f: T => S) 
    17   extends Parser[I, S] {
    17                                   extends Parser[I, S] {
    18   def parse(sb: I) = 
    18   def parse(sb: I) = 
    19     for ((head, tail) <- p.parse(sb)) 
    19     for ((head, tail) <- p.parse(sb)) 
    20       yield (f(head), tail)
    20       yield (f(head), tail)
    21 }
    21 }
    22 
    22