1

私は学校のプロジェクトに取り組んでいます。静的コードアナライザーを作成しています。このための要件は、JavaでC#コードを分析することです。これは、これまでANTLRでうまく機能しています。

Visual StudioでANTLRを使用してスキャンするC#コードの例をいくつか作成しました。ソリューション内のすべてのC#ファイルを分析します。しかし、それは機能しません。メモリリークとエラーメッセージが表示されます:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at org.antlr.runtime.Lexer.emit(Lexer.java:151)
    at org.antlr.runtime.Lexer.nextToken(Lexer.java:86)
    at org.antlr.runtime.CommonTokenStream.fillBuffer(CommonTokenStream.java:119)
    at org.antlr.runtime.CommonTokenStream.LT(CommonTokenStream.java:238)

しばらくすると、すべてのファイルがUTF-8であるため、エンコーディングの問題だと思いました。エンコードされたストリームを読み取れないと思います。そこで、Notepad ++を開いて、すべてのファイルのエンコーディングをANSIに変更したところ、機能しました。ANSIの意味がよくわかりませんが、これは1つの文字セットですか、それともある種の組織ですか。

エンコーディングを任意のエンコーディング(おそらくUTF-8)からこのANSIエンコーディングに変更して、メモリリークが発生しないようにします。

これは、レクサーとパーサーを作成するコードです。

InputStream inputStream = new FileInputStream(new File(filePath));
CharStream charStream = new ANTLRInputStream(inputStream);
CSharpLexer cSharpLexer = new CSharpLexer(charStream);
CommonTokenStream commonTokenStream = new CommonTokenStream(cSharpLexer);
CSharpParser cSharpParser = new CSharpParser(commonTokenStream);
  • InputStreamのエンコーディングを正しいエンコーディングに変更する方法を知っている人はいますか?
  • また、エンコーディングをANSIに変更すると、Notepad ++は何をしますか?
4

2 に答える 2

1

テキスト ファイルを読み取るときは、エンコーディングを明示的に設定する必要があります。次の変更を加えて例を試してください

CharStream charStream = new ANTLRInputStream(inputStream, "UTF-8");

于 2012-05-03T14:19:37.330 に答える
-1

この問題を解決するには、ImputStream を BufferedStream に入れてから、バイト オーダー マークを削除しました。

エンコーディングを明示的に設定しようとしたため、パーサーはそのエンコーディングが気に入らなかったと思います。

于 2012-05-09T01:26:00.607 に答える