あなたの予期しない動作が非常に簡単です、ちょうどskipWhitespace
の値変更のための修正:RegexParsers
の説明から
object CommandOptionsParser extends RegexParsers {
override val skipWhitespace = false
を:
The parsing methods call the method skipWhitespace
(defaults to true
) and, if true, skip any whitespace before each parser is called.
だから、何が起こった、あなたの最初のpair
がマッチしましたwhiteSpace
がスキップされ、repsep
が別の空白区切り文字を見つけることができなかったため、解析が終了したと仮定しただけで、 "\ z"が期待されていました。
また、このような単純な作業のためのParserのアプローチ全体が複雑すぎるように見えますが、単純な正規表現で十分です。
UPD:また、あなたのパーサーは少し単純になります
val pair: Parser[Option[(String, Option[String])]] =
(key ~ ("=" ~> value).?).? ^^ (_.map {case (k ~ v) => k.trim -> v.map(_.trim)})
val pairs: Parser[Map[String, Option[String]]] = phrase(repsep(pair, whiteSpace)) ^^
{ l => Map(l.flatten: _*)}