1
前空格我试图解析两个整数的输入,并且一些元件和端部:解析中的`elem`方法
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
给出。 Ints和最后的元素必须用空格分隔。但是这只适用于Ints而不适用于元素。当我在
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
前插入空格不起作用?我怎样才能使这个代码工作?
谢谢'如预期spaces'工作。但是为什么它在'whiteSpace'时不起作用? – sschaef 2012-03-23 15:37:13
我从不直接使用whiteSpace(默认值为正则表达式= [\ s] +),解析器使用它自动跳过空白(可以通过覆盖skipWhiteSpace覆盖val skipWhitespace = false来禁用它) – fp4me 2012-03-23 16:34:13
I了解'whiteSpace'的功能以及它的定义。但我不明白为什么在明确使用时会导致错误。为什么当它不能再读取输入并继续下一个解析器时它不会停止? – sschaef 2012-03-23 17:21:44