RegexParsersのカスタムエラー

誰かが私に次の行動を理解するのを手伝ってもらいたい parseAll(parseIf、 "If bla blablaa")が期待されるになるはずです。代わりに、私はいつもregex 'と一致する stringが\ b'は期待されていますが、 'b'は見つかりませんでした"bla if blablaa" (最初の空白に気付く)は同じ振る舞いをするため、空白と何か関係があると思います。私はStandardTokenParsersで試してみました。しかし、STPは残念ながら正規表現をサポートしていません。 フォローアップの質問:文字列の代わりに文字列のシーケンスを使用するように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)
1
追加された 編集された
ビュー: 1

1 答え

この問題は非常に奇妙です。 | を呼び出して両側が失敗した場合、最後に失敗した側最後が選択され、左側の方が優先されます。

giverRole で直接解析しようとすると、期待通りの結果が得られます。しかし、失敗の前にマッチを成功させると、それはあなたが見ている結果を生み出します。

理由はやや微妙です - 私はすべてのパーサーに log ステートメントを振りかけることでそれを見つけました。これを理解するには、 RegexParser スキップスペースをどのように行うのかを理解する必要があります。具体的には、スペースは accept でスキップされます。 failureaccept を呼び出さないので、スペースをスキップしません。

kwIs の失敗は、スキップされたスペースとして b で発生しますが、 failure > の場合。ここに:

If bla blablaa
   ^ kwIs fails here
  ^ failure fails here

したがって、 kwIs のエラーメッセージは、私が言及したルールによって優先されます。

この問題を回避するには、パーサーが何も照合せずにスペースをスキップさせるようにします。このパターンが常に一致することが重要です。そうしないと、さらに紛らわしいエラーメッセージが表示されます。私がうまくいくと思う提案があります:

"\\b|$".r ~ failure("is expected")

別の解決策は、暗黙のregex acceptを使用する代わりに acceptIf または acceptMatch を使用することです。

0
追加された
@awertos私はついにその問題が何かを知りました。最初の解決策は、私が思ったよりも適切でした。私は、エラーを適切な場所に表示するように変更しました。スペース以外の文字を消費しないようにしました。
追加された 著者 Daniel C. Sobral,
正規表現とレキシカル能力を持つパーサーを作成し、あなたが提案したようにacceptIfを使用しました。しかし、上記の例は期待どおりに動作しないというのはまだ変です。ご協力いただきありがとうございます
追加された 著者 awertos,