2010-09-02 94 views
4

問題:無法正確打印Unicode字符。ANTLR:Unicode字符掃描

這裏是我的語法:

public static void main(String[] args) { 
SimpleLexer simpleLexer = new SimpleLexer(System.in); 
while(true) { 
try { 
Token t = simpleLexer.nextToken(); 
System.out.println("Token : "+t); 

} catch(Exception e) {} 

} 
} 

對於輸入「ठ」,我得到下面的輸出:主要方法調用詞法分析器的

options { k=1; filter=true; 
// Allow any char but \uFFFF (16 bit -1) 
charVocabulary='\u0000'..'\uFFFE'; 
} 

ANYCHAR :'$' 
| '_' { System.out.println("Found underscore: "+getText()); } 
| 'a'..'z' { System.out.println("Found alpha: "+getText()); } 
| '\u0080'..'\ufffe' { System.out.println("Found unicode: "+getText()); } 
; 

代碼片段

Found unicode: 
Token : ["à",<5>,line=1,col=7] 
Found unicode: 
Token : ["¤",<5>,line=1,col=8] 
Found unicode: 
Token : [" ",<5>,line=1,col=9] 

看來詞法分析器正在處理Unicode ch ar「ठ」爲三個獨立的字符。我的目標是掃描和打印「ठ」。

+1

不相關的問題,但我建議從來沒有「吞噬」你的例外:當事情出錯,你不知道發生了什麼(以及在哪裏)。而不是'catch(Exception e){}'至少可以這樣做:'catch(Exception e){e.printStackTrace(); }' – 2010-09-03 06:21:45

+0

你是正確的先生:)對我來說,教訓:在使用它之前一直讀取複製的代碼。 – Jhakki 2010-09-03 20:04:49

回答

5

您的問題不在ANTLR生成的詞法分析器中,而是在您傳遞給它的Java流中。該流只讀取字節(不以編碼解釋它們),並且您看到的是UTF-8序列。

如果ANTLR 3,你可以使用ANTLRInputStream構造函數的ancoding作爲參數:

ANTLRInputStream (InputStream input, String encoding) throws IOException 
+0

謝謝,就是這樣。 另外,我意識到我使用的是antlr.Tool而不是org.antlr.Tool,並且沒有使用帶ANTLRInputStream的構造函數生成Lexer實現。 – Jhakki 2010-09-03 20:01:17

+0

我知道這是3年後的遠景。然而,你碰巧知道如何爲C#和ANTLR4做這樣的事情嗎?不再有一個使用編碼的構造函數。 – SomeoneRandom 2014-05-05 20:23:48

+0

在這裏添加答案:http://stackoverflow.com/questions/28126507/antlr4-using-non-ascii-characters-in-token-rules/28129510#28129510 – 2015-01-24 19:45:42