5

问题:无法正确打印 Unicode 字符。

这是我的语法:

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()); }
; 

调用词法分析器的主要方法的代码片段:

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) {}

}
}

对于输入"ठ",我得到以下输出:

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 字符“ठ”视为三个单独的字符。我的目标是扫描和打印“ठ”。

4

1 回答 1

6

您的问题不在 ANTLR 生成的词法分析器中,而是在您传递给它的 Java 流中。该流仅读取字节(不以编码方式解释它们),您看到的是一个 UTF-8 序列。

如果它的 ANTLR 3,您可以使用将编码作为参数的ANTLRInputStream构造函数:

ANTLRInputStream (InputStream input, String encoding) throws IOException
于 2010-09-02T22:20:54.113 回答