1

JavaCCによってスローされたParseExceptionを人間が読める形式でフォーマットするにはどうすればよいのでしょうか。実際、例外のトークン参照には、、、などのフィールドが含まれていますが、解析されたソースへの参照は含まれていませんbeginLinebeginColumnendColumnendLine

ありがとう!:)

4

3 に答える 3

1

問題は、JavaCC がデフォルトで生のソース データを保持しないことです。したがって、何らかの方法でトークンへの参照を保持しない限り、トークンはメモリに保持されません。また、すべての通常のトークンに固執したとしても、定義した SKIP トークンに特別な処理を追加する必要があります。たとえば、空白やコメントを破棄するためです。JavaCC がこれらすべてを保持しない理由は、より多くのメモリを使用するためです

すべてのトークン イメージを保持することは間違いなく実行可能です...半手動の介入が必要です。

于 2009-10-15T02:38:37.963 に答える
1

十分かどうかはわかりませんが、キャッチされた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();
    }
于 2011-02-20T20:26:31.743 に答える
0

パーサーを呼び出す前にファイル名を保持してください。次に、ParseException をキャッチしたら、ファイルを再度読み取り、beginLine を使用して正しい行にスキップします。または、ファイル名の代わりに、元のソース テキストを自分で保持します。

私は最近javaccを使用し、まさにそれを行いました。また、インクルードのようなファイルを再帰的に処理する必要があったため、パーサーにインクルードされたソース ファイルのスタックを構築させました。ParseException をキャッチすると、ユーザーが各ファイルが含まれているコンテキスト (つまり、親の行番号) を確認できるように、スタックを調べるのは簡単なことでした。

于 2011-06-24T21:15:37.013 に答える