1

This seems pretty simple!

class SeparatedParser(val input: ParserInput, val delimiter: String = ",") extends Parser {

  def pipedField = rule { (zeroOrMore(field).separatedBy("|")) }
  def field = rule { capture(zeroOrMore(noneOf(delimiter))) }

  def d = delimiter

  def record = rule {
    field ~ d ~ pipedField ~ d ~ field ~ EOI
  }
}

I try:

val parser = new SeparatedParser("""49798,piped1|piped2,sklw""")
val parsed = parser.record.run()
parsed match {
  case Success(rel) => println(rel)
  case Failure(pe:ParseError) =>println(parser.formatError(pe)) 
}

But I get:

49798 :: Vector(piped1|piped2) :: sklw :: HNil

I would expect the Vector to have two separate elements: piped1 and piped2.

What dumbass mistake am I making?

Dan Gravell
  • 7,855
  • 7
  • 41
  • 64
  • 1
    `field` consumes everything until `delimiter` is found. Therefore, if you only look at `piped1|piped2,` it obviously eats everything up to the comma, even the `|`. – kiritsuku Dec 17 '15 at 17:50
  • Yep, a dumbass mistake! That works, care to turn that into an answer so I can accept? – Dan Gravell Dec 17 '15 at 18:24

0 Answers0