2

間違った入力テキストを文法にフィードしようとしていると考えてください(たとえば、不明なトークンを含むテキスト)。ANTLRWorks解釈中、グラフで表示さNoViableAltExceptionれます。

UPD:この例外が発生する場合は2つあります。

1)既知のトークンの予期しない使用。この場合、次のようなものを受け取ります。line 5:36 no viable alternative at input ','

2)不明なトークンタイプを使用します。たとえば、文法は@記号で始まるトークンについて何も知りません。そして、そのようなトークンを含むテキストを文法にフィードしようとしています。

残念ながら、(2)の場合、この例外はANTLRWorksデバッガーでも生成されたJavaコードでもスローされません。しかし、それはANTLRWorks通訳者の結果グラフにのみ見られます。

また、次の標準コードを文法に追加しようとしました。

@parser::members {
    private IErrorReporter errorReporter = null;
    public void setErrorReporter(IErrorReporter errorReporter) {
        this.errorReporter = errorReporter;
    }
    public void emitErrorMessage(String msg) {
        errorReporter.reportError(msg);
    }
}
@lexer::members {
    ... the same code as above ...
}

この構造は、タイプ(1)の解析エラー(トークンの予期しない使用に関するエラーなど)を正常にキャッチしますline 5:36 no viable alternative at input ','。ただし、トークンが不明な実行不可能な入力の場合、パーサーはエラー報告なしchildren == nullで最上位のオブジェクトを生成します。CommonTree

私はを使用してantlr 3.5います。

質問:NoViableAltException生成されたJavaコードで記述された状況を把握することは可能ですか?

4

2 に答える 2

2

さて、この質問の私の2番目の部分に280Z28によって与えられたこの答えは、両方の問題をうまく解決します。だから、これは正しい答えです。

于 2013-03-13T13:37:49.777 に答える
0

レクサーの最後のルールとして、以下を追加する必要があります。無効な文字のトークンを作成し、それをパーサーに送信して、エラーが適切に報告されます。

ANYCHAR : . ;
于 2013-03-13T13:15:39.107 に答える