2012-05-03 44 views
1

我正在为学校开展一个项目。我们正在制作一个静态代码分析器。 对此的一个要求是分析Java中的C#代码,这对于ANTLR来说是非常好的。如何使用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编码,所以我不会再发生内存泄漏。

这是使词法和语法分析器代码:

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 ++会做什么?
+0

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

回答

-1

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

我想我的解析器不喜欢那种编码,因为我也尝试明确设置编码。

1

阅读文本文件时,应该明确设置编码。试试你提供以下变化

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

+0

我在这里为ANTLR4添加了一个答案。 http://stackoverflow.com/questions/28126507/antlr4-using-non-ascii-characters-in-token-rules/28129510#28129510 –