在下面的DSL,我成功地解析“富”,其次是0个或多个repititions conj ~ noun
。
object Foo extends JavaTokenParsers {
def word(x: String) = s"\\b$x\\b".r
lazy val expr = word("foo") ~ rep(conj ~ noun)
val noun = word("noun")
val conj = word("and") | err("not a conjunction!")
}
信用 :感谢特拉维斯布朗解释为需要word
功能在这里 。
测试掉无效的结合时,它看起来不错。
scala> Foo.parseAll(Foo.expr, "foo an3 noun")
res29: Foo.ParseResult[Foo.~[String,List[Foo.~[java.io.Serializable,String]]]] =
[1.5] error: not a conjunction!
foo an3 noun
^
但是,另一项测试表明,它不工作- foo and noun
应该会成功。
scala> Foo.parseAll(Foo.expr, "foo and noun")
res31: Foo.ParseResult[Foo.~[String,List[Foo.~[java.io.Serializable,String]]]] =
[1.13] error: not a conjunction!
foo and noun
^
由于该传入的字符串只包含foo and noun
,我不知道其他字符/正在读什么记号。
我已经取代上述err
与failure
,但是这是没有好或者:
scala> Foo.parseAll(Foo.expr, "foo a3nd noun")
res32: Foo.ParseResult[Foo.~[String,List[Foo.~[java.io.Serializable,String]]]] =
[1.5] failure: string matching regex `\z' expected but `a' found
foo a3nd noun
^
我相信, Parsers#rep
介绍了过去failure
消息:
def rep[T](p: => Parser[T]): Parser[List[T]] = rep1(p) | success(List())
在此基础上优秀的答案 ,我的理解是, rep1(p)
其中P是conj ~ noun
)将会失败,导致success(List())
因为未能允许后台跟踪)。 但是,我不完全知道为什么success(List())
不回来了-失败的消息称: failure: string matching regex '\z' expected but 'a'' found
-它预计行尾。