Java ANTLR:Unicode字符扫描

Java ANTLR:Unicode字符扫描,java,antlr,lexer,Java,Antlr,Lexer,问题:无法正确打印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("

问题:无法正确打印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()); }
; 
调用lexer的主方法的代码段:

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:
标记:[“a”,行=1,列=7]
找到unicode:
令牌:[“·行=1,列=8]
找到unicode:
标记:[“”,第行=1,第列=9]

似乎lexer正在处理Unicode字符“ठ“作为三个独立的字符。我的目标是扫描和打印”ठ“

您的问题不在ANTLR生成的lexer中,而是在您传递给它的Java流中。该流只读取字节(不在编码中解释它们),您看到的是UTF-8序列

如果是ANTLR 3,则可以使用将ancoding作为参数的构造函数:

ANTLRInputStream (InputStream input, String encoding) throws IOException

与您的问题无关,但我建议永远不要“吞下”您的异常:当出现问题时,您不知道发生了什么(以及发生在哪里)。至少不要
catch(Exception e){}
至少要做:
catch(Exception e){e.printStackTrace();}
你是对的,先生:)给我的教训是:在使用之前把复制的代码通读到底。谢谢,就是这样。另外,我意识到我使用的是antlr.Tool,而不是org.antlr.Tool,而这并不是用接受ANTLRInputStream的构造函数生成Lexer实现。我知道这是一个很长的时间,要超过3年呃。但是,你知道如何对C#和ANTLR4执行类似的操作吗?现在已经没有使用编码的构造函数了。在这里添加了答案:他使用的是
char词汇表
,这仅在ANTLR 2中可用。有没有一种解决方案可以与该ANTLR版本一起使用?