可能有人帮助我理解以下行为:
parseAll (parseIf, "If bla blablaa")
应该导致is expected
. 相反,我总是得到string matching regex 'is\b' expected but 'b' found
. 我想这与空格有关,因为" If bla is blablaa"
(注意开头的空格)会导致相同的行为。我用 StandardTokenParsers 试了一下,一切正常。但不幸的是,STP 不支持正则表达式。后续问题:我将如何更改 RegexParsers 以便它使用字符串序列而不是字符序列?这将使错误报告变得更加容易。
lazy val parseIf = roleGiverIf ~ giverRole
lazy val roleGiverIf =
kwIf ~> identifier | failure("""A rule must begin with if""")
lazy val giverRole =
kwIs ~> identifier | failure("""is expected""")
lazy val keyword =
kwIf | kwAnd | kwThen | kwOf | kwIs | kwFrom | kwTo
lazy val identifier =
not(keyword) ~ roleEntityLiteral
// ...
def roleEntityLiteral: Parser[String] =
"""([^"\p{Cntrl}\\]|\\[\\/bfnrt]|\\u[a-fA-F0-9]{4})\S*""".r
def kwIf: Parser[String] = "If\\b".r
def kwIs: Parser[String] = "is\\b".r
// ...
parseAll(parseIf, "If bla blablaa") match {
case Success(parseIf, _) => println(parseIf)
case Failure(msg, _) => println("Failure: " + msg)
case Error(msg, _) => println("Error: " + msg)