誰かが次の動作を理解するのを手伝ってくれますか:
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)