有人可以帮助我理解以下行为: parseAll (parseIf, "If bla blablaa")
应导致is expected
。相反,我总是得到string matching regex 'is\b' expected but 'b' found
。 我想它与空格有关,因为" If bla is blablaa"
(注意开始处的空白)会导致相同的行为。我用StandardTokenParsers试了一下,一切正常。但STP不幸的是不支持正则表达式。 后续问题:我将如何修改RegexParsers,以便使用一系列字符串而不是一系列字符?这将使错误报告更容易。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)
我写了一个正则表达式和词法能力的解析器,并根据您的建议使用acceptIf。但上面的例子不能按预期工作仍然很奇怪。感谢您的帮助 – awertos
@awertos我终于找出问题所在。第一种解决方案比我想象的更合适 - 我只是改变它,使错误出现在适当的地方,不消耗任何非空间字符。 –