2 つの Int といくつかの要素と末尾の入力を解析しようとしました。
import scala.util.parsing.combinator.JavaTokenParsers
class X extends JavaTokenParsers {
lazy val elems = elem("wrong elem", "#WB-" contains _)
lazy val lists = repsep(rep(elems), ",")
lazy val p1 = int ~ int ~ lists
lazy val p2 = int ~ int ~ (whiteSpace ~> lists)
def go[A](p: Parser[A]) = parseAll(p, "1 2 WB#,---,BBB") match {
case NoSuccess(msg, _) => sys.error(msg)
case _ =>
}
lazy val int: Parser[Int] =
wholeNumber ^^ {
try _.toInt catch {
case e: NumberFormatException => sys.error("invalid number")
}
}
}
メソッド に入力例を示しますgo
。Int と末尾の要素は、スペースで区切る必要があります。ただし、これは Int に対してのみ機能し、要素に対しては機能しません。入力すると
val x = new X
x go x.p1
次のエラーが表示されます。
java.lang.RuntimeException: string matching regex `\z' expected but `W' found
しかし、私が入力すると
x go x.p1
私は得る:
java.lang.RuntimeException: string matching regex `\s+' expected but `W' found
最後に、私はParser[Int ~ Int ~ List[List[Char]]]
. 前に空白を挿入しても機能しないのはなぜelem
ですか? そして、どうすればこのコードを機能させることができますか?