equal
  deleted
  inserted
  replaced
  
    
    
|     12  |     12  | 
|     13 // more convenience for the map parsers later on; |     13 // more convenience for the map parsers later on; | 
|     14 // it allows writing nested patterns as |     14 // it allows writing nested patterns as | 
|     15 // case x ~ y ~ z => ... |     15 // case x ~ y ~ z => ... | 
|     16  |     16  | 
|     17 case class ~[+A, +B](x: A, y: B) |     17 case class ~[+A, +B](x: A, y: B)  | 
|     18  |     18  | 
|     19 // to make sure the input has an empty-method |     19 // to make sure the input has an empty-method | 
|     20 trait IsSeq[I] { |     20 trait IsSeq[I] { | 
|     21   extension (i: I) def isEmpty: Boolean |     21   extension (i: I) def isEmpty: Boolean | 
|     22 } |     22 } | 
|     32   def parse_all(in: I) : Set[T] = |     32   def parse_all(in: I) : Set[T] = | 
|     33     for ((hd, tl) <- parse(in);  |     33     for ((hd, tl) <- parse(in);  | 
|     34         if tl.isEmpty) yield hd |     34         if tl.isEmpty) yield hd | 
|     35  |     35  | 
|     36   // alternative parser |     36   // alternative parser | 
|     37   def ||(q: => Parser[I, T]) : Parser[I, T] = Parser[I, T] { |     37   def ||(q: => Parser[I, T]) : Parser[I, T] = new Parser[I, T] { | 
|     38     def parse(in: I) = p.parse(in) ++ q.parse(in) |     38     def parse(in: I) = p.parse(in) ++ q.parse(in) | 
|     39   } |     39   } | 
|     40  |     40  | 
|     41   // sequence parser |     41   // sequence parser | 
|     42   def ~[S](q: => Parser[I, S]) = new Parser[I, T ~ S] { |     42   def ~[S](q: => Parser[I, S]) = new Parser[I, T ~ S] { |