誰かが私に次のような動作を理解させる助けになるかもしれません: parseAll (parseIf, "If bla blablaa")
はis expected
になります。代わりに私はいつもstring matching regex 'is\b' expected but 'b' found
を得る。 " If bla is blablaa"
(最初は空白に気付く)が同じ振る舞いをするので、空白と何か関係があると思います。私はStandardTokenParsersで試してみました。しかし、STPは残念ながら正規表現をサポートしていません。 フォローアップの質問:文字列の代わりに文字列のシーケンスを使用するようにRegexParserを変更する必要がありますか?そうすれば、エラー報告がもっと簡単になります。RegexParserのカスタムエラー
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私は最終的に問題が何かを知った。最初の解決策は、私が思ったよりも適切でした。私は、エラーを適切な場所に表示するように変更しました。スペース以外の文字を消費しないようにしました。 –