我正在为学校做一个项目。我们正在制作静态代码分析器。 对此的要求是分析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。我认为它无法读取编码的Stream。所以我打开了Notepad ++,我将每个文件的编码改为ANSI,然后就可以了。我真的不明白ANSI的意思,这是一个字符集还是某种组织?
我想将编码从任何编码(可能是UTF-8)更改为此ANSI编码,这样我就不会再出现内存泄漏。
这是制作Lexer和Parser的代码:
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);
答案 0 :(得分:1)
阅读文本文件时,应明确设置编码。尝试使用以下更改的示例
CharStream charStream = new ANTLRInputStream(inputStream, "UTF-8");
答案 1 :(得分:-1)
我通过将ImputStream放入BufferedStream然后删除字节顺序标记解决了这个问题。
我猜我的解析器不喜欢那种编码,因为我也试过明确设置编码。