意味的なエラーを表示するには、独自の方法を使用することをおすすめします。しかし、このためにANTLRにとどまる必要がある場合:
まず、カスタム例外タイプを作成する場合は、独自のエラーハンドラを作成する必要があります。 antlr3baserecognizer.c:1000のオリジナルを見てください。
static void
displayRecognitionErrorNew (pANTLR3_BASE_RECOGNIZER recognizer,
pANTLR3_UINT8 * tokenNames)
{
...
switch (ex->type)
{
case ANTLR3_UNWANTED_TOKEN_EXCEPTION:
...
case NUTF_EXCEPTION:
printf("Non unique token found");
break;
次に、例外構造を処理する関数またはルールコードを記述します。あなたの例外を設定するantlr3baserecognizer.c:325を見てください。
ex = antlr3ExceptionNew(ANTLR3_RECOGNITION_EXCEPTION,
(void *)ANTLR3_RECOGNITION_EX_NAME,
NULL,
ANTLR3_FALSE);
ex->type = NUTF_EXCEPTION
ex->line = ins->getLine (ins);
ex->charPositionInLine = ins->getCharPositionInLine (ins);
ex->index = is->index (is);
ex->streamName = ins->fileName;
ex->message = "That was totally unexpected";
次に、エラーを検出したときに実際に例外をスローする必要があります。私はこれを行う唯一の方法は、あなたのコードを追加し、あなたのルールから呼び出す不一致()をオーバーライドすることだと思います。
最後に、新しい機能を使用するようにANTLRに指示します。
@parser::apifuncs {
RECOGNIZER->displayRecognitionError = displayRecognitionErrorNew;
RECOGNIZER->antlr3RecognitionExceptionNew = antlr3RecognitionExceptionNewNew;
RECOGNIZER->mismatch = mismatchNew;
}
お返事ありがとうございます。ちょうどメモ、私の問題は、それらのメンバーを過負荷ではない、それは完了しました:)私の質問は、ネイティブコードで自分自身の検証です。例外を投げてエラーを報告する適切な方法はありますか? – chollida