JavaCCによってスローされたParseExceptionを人間が読める形式でフォーマットするにはどうすればよいのでしょうか。実際、例外のトークン参照には、、、などのフィールドが含まれていますが、解析されたソースへの参照は含まれていませんbeginLine
。beginColumn
endColumn
endLine
ありがとう!:)
JavaCCによってスローされたParseExceptionを人間が読める形式でフォーマットするにはどうすればよいのでしょうか。実際、例外のトークン参照には、、、などのフィールドが含まれていますが、解析されたソースへの参照は含まれていませんbeginLine
。beginColumn
endColumn
endLine
ありがとう!:)
問題は、JavaCC がデフォルトで生のソース データを保持しないことです。したがって、何らかの方法でトークンへの参照を保持しない限り、トークンはメモリに保持されません。また、すべての通常のトークンに固執したとしても、定義した SKIP トークンに特別な処理を追加する必要があります。たとえば、空白やコメントを破棄するためです。JavaCC がこれらすべてを保持しない理由は、より多くのメモリを使用するためです。
すべてのトークン イメージを保持することは間違いなく実行可能です...半手動の介入が必要です。
十分かどうかはわかりませんが、キャッチされたParseExceptionオブジェクトからプロパティcurrentTokenを使用できます。
try {
parser.Start();
}
catch(ParseException e){
System.out.println("Problem with code!");
System.out.println("Unknown symbol >> "
+ e.currentToken.image
+ " << Line:" + e.currentToken.beginLine
+ ", column:" + e.currentToken.beginColumn);
//e.printStackTrace();
}
パーサーを呼び出す前にファイル名を保持してください。次に、ParseException をキャッチしたら、ファイルを再度読み取り、beginLine を使用して正しい行にスキップします。または、ファイル名の代わりに、元のソース テキストを自分で保持します。
私は最近javaccを使用し、まさにそれを行いました。また、インクルードのようなファイルを再帰的に処理する必要があったため、パーサーにインクルードされたソース ファイルのスタックを構築させました。ParseException をキャッチすると、ユーザーが各ファイルが含まれているコンテキスト (つまり、親の行番号) を確認できるように、スタックを調べるのは簡単なことでした。