2017-02-10 5 views
1

私はより美しいエラーメッセージをユーザーに見せたいと思います。ANTLR4の "入力時に実行可能な代替手段がありません" <EOF> '"というニースのエラーメッセージ

たとえば、誰かがinteger i=と入力すると、エラーメッセージno viable alternative at input '<EOF>'が表示されます。それは私の文法の規則のために完全にうまく、予測可能ですが、私はそれらのメッセージを改善する方法を考え出しています。上記の例で=が見つからない場合、メッセージはmismatched input '<EOF>' expecting '='に変わります。再び予測可能ですが、一般的な入力エラーよりもコード内でこれほど多くのことを行うことができます。

私はコードでそれらを捕らえて、どのケースが意味するのを評価しようとしますか?または、これを処理するより良い方法はありますか?

答えて

1

通常は、独自のエラーリスナーを作成し、パーサーに追加してエラーを処理します。そのためには、parser.removeErrorListeners();を呼び出して既存のエラーリスナーを削除します(デフォルトでは、コンソール用のリスナーが自動的に登録されます)。 BaseErrorListenerから派生した独自のエラーリスナクラスを定義し、そのインスタンスをparser.addErrorListener(yourListener);経由でパーサーに追加します。このようなカスタム・エラー・リスナーの例は、ANTLRランタイムで確認できます(XPathLexerErrorListenerを検索してください)。 syntaxErrorメソッドをオーバーライドし、提供された情報を使用して独自のエラーメッセージを生成します。このメソッドには、すでにコードが生成されているので直接カスタマイズすることはできません(行+文字位置、例外などの他の要素に加えて)メッセージが既に渡されています。だから、おそらくそれを残して、最初から始めるのが良いでしょう(例外として、あなたが持っている最良の選択肢です)。

+0

これは私がこの時点でやっていることです。私は自分自身のエラーリスナーで、彼がその問題を解決するのをサポートするために、ユーザーに表示するか、表示するべきかを理解しようとしています。私が正しい軌道にいることを確認してくれてありがとう! – FDeitelhoff

関連する問題