質問: "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) ```
回答: この問題は非常に奇妙です。 `|` を呼び出して両側が失敗した場合、最後に失敗した側*最後*が選択され、左側の方が優先されます。 `giverRole` で直接解析しようとすると、期待通りの結果が得られます。しかし、失敗の前にマッチを成功させると、それはあなたが見ている結果を生み出します。 理由はやや微妙です - 私はすべてのパーサーに `log` ステートメントを振りかけることでそれを見つけました。これを理解するには、 *`RegexParser` スキップスペースをどのように*行うのかを理解する必要があります。具体的には、スペースは `accept` でスキップされます。 `failure` は `accept` を呼び出さないので、スペースをスキップしません。 `kwIs` の失敗は、スキップされたスペースとして `b` で発生しますが、 `failure` > の場合。ここに: ``` If bla blablaa ^ kwIs fails here ^ failure fails here ``` したがって、 `kwIs` のエラーメッセージは、私が言及したルールによって優先されます。 この問題を回避するには、パーサーが何も照合せずにスペースをスキップさせるようにします。このパターンが常に一致することが重要です。そうしないと、さらに紛らわしいエラーメッセージが表示されます。私がうまくいくと思う提案があります: ``` "\\b|$".r ~ failure("is expected") ``` 別の解決策は、暗黙のregex acceptを使用する代わりに `acceptIf` または `acceptMatch` を使用することです。