ANTLR:Unicode字符扫描
问题:无法正确打印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“ठ”为三个独立的字符。我的目标是扫描和打印“ठ”。
您的问题不在ANTLR生成的词法分析器中,而是在您传递给它的Java流中。该流只读取字节(不以编码解释它们),并且您看到的是UTF-8序列。
如果ANTLR 3,你可以使用ANTLRInputStream构造函数的ancoding作为参数:
ANTLRInputStream (InputStream input, String encoding) throws IOException
谢谢,就是这样。 另外,我意识到我使用的是antlr.Tool而不是org.antlr.Tool,并且没有使用带ANTLRInputStream的构造函数生成Lexer实现。 – Jhakki 2010-09-03 20:01:17
我知道这是3年后的远景。然而,你碰巧知道如何为C#和ANTLR4做这样的事情吗?不再有一个使用编码的构造函数。 – SomeoneRandom 2014-05-05 20:23:48
在这里添加答案:http://stackoverflow.com/questions/28126507/antlr4-using-non-ascii-characters-in-token-rules/28129510#28129510 – 2015-01-24 19:45:42
不相关的问题,但我建议从来没有“吞噬”你的例外:当事情出错,你不知道发生了什么(以及在哪里)。而不是'catch(Exception e){}'至少可以这样做:'catch(Exception e){e.printStackTrace(); }' – 2010-09-03 06:21:45
你是正确的先生:)对我来说,教训:在使用它之前一直读取复制的代码。 – Jhakki 2010-09-03 20:04:49