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 |