2012-05-03 110 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 –