ANTLR不匹配unicode转义字符

时间:2011-10-08 15:57:33

标签: antlr antlr3

我正在为类C语言编写解析器/解释器,我需要解释转义字符。其中一个是具有此模式“\ uXXXX”的unicode转义序列,其中X是一些十六进制数。

我的ANTLR规则如下:

public char returns [char c] 
    : '\\"' { $c = '"'; } 
    | '\\\\' { $c = '\\'; }
    | '\\/' { $c = '/'; }
    | '\\b' { $c = '\b'; }
    | '\\f' { $c = '\f'; }
    | '\\n' { $c = '\n'; }
    | '\\r' { $c = '\r'; }
    | '\\t' { $c = '\t'; }
    | '\\u' HEXDIGIT HEXDIGIT HEXDIGIT HEXDIGIT { $c = 'e'; }
    | ~('\\' | '"') { $c = '/'; }
    ;

fragment HEXDIGIT
    : ('0'..'9'|'a'..'f'|'A'..'F')

我正在给它提供这个字符串“\ u1234”,我期待一个'e',但我得到一个'/',这是其他一切的后备规则。

是否有一些神奇的juju正在进行碎片和规则或我不知道的事情?

1 个答案:

答案 0 :(得分:1)

正如Adam所提到的,char目前是一个解析器规则,但应该成为词法分析器规则,在这种情况下你不能让它返回char(lexer规则总是返回Token的实例!)。

您可以使用setText(...)方法调整令牌的内部文本(假设Java是目标语言):

// lexer rules start with a capital!
Char
  :  '\\"'                                     { setText("\""); } 
  |  '\\\\'                                    { setText("\\"); } 
  |  '\\/'                                     { setText("/"); } 
  |  '\\b'                                     { setText("\b"); } 
  |  '\\f'                                     { setText("\f"); } 
  |  '\\n'                                     { setText("\n"); } 
  |  '\\r'                                     { setText("\r"); } 
  |  '\\t'                                     { setText("\t"); } 
  |  '\\u' HEXDIGIT HEXDIGIT HEXDIGIT HEXDIGIT 
     { 
       String hex = getText();
       int i = Integer.parseInt(hex.substring(2), 16);
       setText(hex + " base 10 = " + i);
     } 
  |  ~('\\' | '"')
  ;

fragment HEXDIGIT
  :  ('0'..'9'|'a'..'f'|'A'..'F')
  ;