【问题标题】:How do I get this encoding right with ANTLR?如何使用 ANTLR 正确编码?
【发布时间】:2012-05-03 11:57:23
【问题描述】:

我正在为学校做一个项目。我们正在制作一个静态代码分析器。 对此的要求是分析 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。我认为它无法读取编码的流。所以我打开记事本++,并将每个文件的编码更改为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);
  • 有谁知道如何将 InputStream 的编码更改为正确的编码?
  • 当我将编码更改为 ANSI 时,Notepad++ 会做什么?

【问题讨论】:

  • 我不确定像 Pastebin 这样的网站是否保持正确的编码。但这里有一个例子:pastebin.com/ji8AHcRN

标签: c# java encoding antlr ansi


【解决方案1】:

读取文本文件时,您应该明确设置编码。尝试以下更改的示例

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

【讨论】:

【解决方案2】:

我通过将 ImputStream 放入 BufferedStream 中解决了这个问题,然后删除了字节顺序标记。

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

【讨论】:

    猜你喜欢
    • 2018-01-28
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    • 2018-05-09
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    相关资源
    最近更新 更多