【问题标题】:ANTLR: Unicode Character ScanningANTLR:Unicode 字符扫描
【发布时间】:2010-09-02 21:57:24
【问题描述】:

问题:无法正确打印 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()); }
; 

调用词法分析器的main方法的代码sn-p:

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

【问题讨论】:

  • 与您的问题无关,但我建议永远不要“吞下”您的异常:当出现问题时,您不知道发生了什么(以及发生在哪里)。至少不要使用catch(Exception e) {}catch(Exception e) { e.printStackTrace(); }
  • 你是对的先生 :) 给我的教训:在使用之前将复制的代码一直阅读到最后。

标签: java antlr lexer


【解决方案1】:

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

如果它的 ANTLR 3,你可以使用 ANTLRInputStream 构造函数,它接受一个编码作为参数:

ANTLRInputStream (InputStream input, String encoding) throws IOException

【讨论】:

  • 谢谢,就是这样。此外,我意识到我使用的是 antlr.Tool,而不是 org.antlr.Tool,并且这并没有使用采用 ANTLRInputStream 的构造函数生成 Lexer 实现。
  • 我知道这在 3 年后是一个很长的机会。但是,你碰巧知道如何为 C# 和 ANTLR4 做这样的事情吗?根本不再有使用编码的构造函数。
  • 他使用了charVocabulary,它只在 ANTLR 2 中可用。有没有适用于该 ANTLR 版本的解决方案?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-30
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 2014-03-29
相关资源
最近更新 更多