1

私は単純な文法を持っており、antlr 2.7.7 を使用して一対の C# クラスを作成しました。パーサーがトークンでエラーを検出すると、例外をスローします。トークンが解析されたストリームに何文字入ったかを知りたいです。それ、どうやったら出来るの?

4

2 に答える 2

2

ANTLR で遊んでからずいぶん前のことですが、よく覚えていれば、やりたいことを行うには、パーサーをサブクラス化して、新しいトークンが見つかるたびにインクリメントされる文字のカウンターを保持する必要がありました (トークンを使用してもちろん長さ)。

于 2008-10-07T13:06:08.380 に答える
2

Terrence Parr の著書「The Definitive ANTLR Reference」の第 10 章 (「Error Reporting and Recovery」) を読む必要があります。

使用しているターゲット言語がわからないため、何をすべきかを正確に伝えるのは困難です。ただし、Java ターゲットを使用していると仮定します。間違っている場合は訂正してください。

ANTLR レコグナイザーが入力文字列の照合に失敗すると、失敗のコンテキストに基づいて非常に具体的な例外がスローされます。(9 種類の例外があり、RecognitionException はルート タイプであり、独自の 8 つのサブクラスがあります: MismatchedTokenException、MismatchedTreeNodeException、NoViableAltException、EarlyExitException、FailedPredicateException、MismatchedRangeException、MismatchedSetException、MismatchedNotSetException)。

ルート例外の種類 (RecognitionException) には、いくつかの便利なパブリック フィールドがあります (具体的には、「index」、「line」、および「charPositionInLine」)。「インデックス」フィールドは、エラーが見つかった正確な文字位置を示します。「line」フィールドと「charPositionInLine」フィールドは一目瞭然です。JavaDoc は次のとおりです。

http://www.antlr.org/api/Java/classorg_1_1antlr_1_1runtime_1_1_recognition_exception.html

于 2008-10-07T13:27:24.560 に答える