我如何使用 ANTLR 正确进行此编码

本文关键字:编码 何使用 ANTLR | 更新日期: 2023-09-27 18:32:58

我正在为学校做一个项目。我们正在制作一个静态代码分析器。这样做的一个要求是分析Java中的C#代码,到目前为止,ANTLR已经很好地完成了这项工作。

我制作了一些示例C#代码,以便在Visual Studio中使用ANTLR进行扫描。我分析解决方案中的每个 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是什么意思,这是一个字符集还是某种组织?

我想将编码从任何编码(可能是 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);
  • 有谁知道如何将输入流的编码更改为正确的编码?
  • 当我将编码更改为 ANSI 时,Notepad++ 有什么作用?

我如何使用 ANTLR 正确进行此编码

读取文本文件时,应显式设置编码。尝试使用以下更改的示例

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

我通过将ImputStream放入BufferedStream然后删除字节顺序标记来解决此问题。

我想我的解析器不喜欢这种编码,因为我也尝试显式设置编码。