1

PetitParserDartでいくつかのルールを定義しました:

def("start", ref("rule").separatedBy(char('\n'), includeSeparators: false);
def("rule", char('(').seq(word().plus()).seq(char(')')));

したがって、次のテキストが一致します。

(aaa)
(bbbbbb)

ただし、一致できない行がある場合:

(aaaa)
bbbbb
(cccccccc

文法を定義して失敗させ、オンライン(cccccccccではなくオンラインで例外をスローさせるにはどうすればよいbbbbbですか?

つまり、ルールが完全に一致しない場合にのみ例外をスローします。何も一致しない場合、例外はスローされません。

4

1 に答える 1

1

文法のどの時点でも、失敗したパーサーを導入できます。

failure('This parser always fails at this point');

通常、PetitParser は解析中に例外を使用しません。成功と失敗は、それぞれのSuccessFailure応答コンテキストで示されます。

そうは言っても、例外をスローすることは可能ですが、文法のユーザーがそれを処理できない限り、通常はお勧めしません。たとえば、次のようにスローするパーサー ファクトリを定義できます。

Parser thrower(String message) {
  return epsilon().map((value) => throw new IllegalStateException(message));
}

通常のコンポジターを使用すると、非常に正確なエラー メッセージを生成できます。

char('(')
  .seq(word().plus())
  .seq(char(')')
    // causes the parser to continue trying to parse the input
    .or(failure('something bad happened')))

または、上記のヘルパーを使用して:

char('(')
  .seq(word().plus())
  .seq(char(')')
     // stops parsing altogether and throws an exception
    .or(thrower('something bad happened')))
于 2013-07-11T05:04:33.450 に答える