私は ANTLR 3 を使用しています。入力でエラーが発生した場合、次の予想されるトークンをどのように見つけることができるかという質問があります。パーサーの getErrorMessage(RecognitionException e, String[] tokenNames) をオーバーライドしようとしましたが、エラーを取得できますが、 What is next expected token を取得できません。誰かが助けることができれば。前もって感謝します。
1 に答える
それは思ったほど簡単ではありません。そして、多くの場合、そのような情報は利用できません。
たとえば、文法は次のような括弧で囲まれた式と一致できます(1+2)
。
パーサーが を解析しようとする"(1+2"
と、MismatchedTokenException
がスローされ、そのexpecting
属性は の型になり')'
ます。ですから、それは簡単なことです。
ただし、 を解析しようとすると、再び"1+2)"
aがスローされますが、パーサーは のような式を解析することを期待しているため、 が必要であると不平を言います。「過去」のどこかで を忘れたことはわかりません。MismatchedTokenException
EOF
1+2
'('
そのため、パーサーによって発生した例外から予想されるトークンを抽出できるのは、2、3 回だけです。ほとんどの場合、この情報を自分で抽出するために (多くの困難な) 作業を行う必要があります。パーサーで意味のあるエラー メッセージを作成するのは簡単なことではありません。(少なくとも、それほど複雑ではない言語の文法を単純に書くこととは比較にならない)
ANTLR の API ドキュメントを参照して、ANTLR によってスローされている例外を確認し、目的に応じてパーサーに無効な入力をフィードし、パーサーでオーバーライドして、スローされる例外を確認することをお勧めreportError(...)
します。
@parser::members {
@Override
public void reportError(RecognitionException e) {
// inspect 'e' and handle/report it
}
}