mismatch
およびメソッドをオーバーライドして、例外がすぐにスローされるようにする必要がありますrecoverFromMismatchedSet
(例は Java の場合です)。
@members {
protected void mismatch(IntStream input, int ttype, BitSet follow) throws RecognitionException {
throw new MismatchedTokenException(ttype, input);
}
public Object recoverFromMismatchedSet(IntStream input, RecognitionException e, BitSet follow) throws RecognitionException {
throw e;
}
}
次に、パーサーがこれらの例外を処理する方法を変更して、それらが飲み込まれないようにする必要があります。
@rulecatch {
catch (RecognitionException e) {
throw e;
}
}
(パーサー内のすべてのルール マッチング メソッドの本体は、try
これをブロックとして、catch
ブロックで囲まれます。)
比較のために、recoverFromMismatchedSet
継承された fromのデフォルトの実装BaseRecognizer
:
public Object recoverFromMismatchedSet(IntStream input, RecognitionException e, BitSet follow) throws RecognitionException {
if (mismatchIsMissingToken(input, follow)) {
reportError(e);
return getMissingSymbol(input, e, Token.INVALID_TOKEN_TYPE, follow);
}
throw e;
}
デフォルトのルールキャッチ:
catch (RecognitionException re) {
reportError(re);
recover(input,re);
}