equal
  deleted
  inserted
  replaced
  
    
    
    32 //    type parameter I needs to be of Seq-type  | 
    32 //    type parameter I needs to be of Seq-type  | 
    33 //  | 
    33 //  | 
    34 abstract class Parser[I, T](implicit ev: I => Seq[_]) { | 
    34 abstract class Parser[I, T](implicit ev: I => Seq[_]) { | 
    35   def parse(ts: I): Set[(T, I)]  | 
    35   def parse(ts: I): Set[(T, I)]  | 
    36   | 
    36   | 
    37   def parse_all(ts: I) : Set[T] =  | 
    37   def parse_single(ts: I) : T =   | 
    38     for ((head, tail) <- parse(ts); if (tail.isEmpty)) yield head  | 
    38     parse(ts).partition(_._2.isEmpty) match { | 
    39   | 
    39       case (good, _) if !good.isEmpty => good.head._1  | 
    40   def parse_single(ts: I) : T = parse_all(ts).toList match { | 
    40       case (_, err) => {  | 
    41     case List(t) => t  | 
    41 	println (s"Parse Error\n${err.minBy(_._2.length)}") ; sys.exit(-1) } | 
    42     case _ => { println ("Parse Error\n") ; sys.exit(-1) } | 
    42     }  | 
    43   }  | 
         | 
    44 }  | 
    43 }  | 
    45   | 
    44   | 
    46 // convenience for writing grammar rules  | 
    45 // convenience for writing grammar rules  | 
    47 case class ~[+A, +B](_1: A, _2: B)  | 
    46 case class ~[+A, +B](_1: A, _2: B)  | 
    48   | 
    47   |