Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ANTLR与unicode转义字符不匹配_Antlr_Antlr3 - Fatal编程技术网

ANTLR与unicode转义字符不匹配

ANTLR与unicode转义字符不匹配,antlr,antlr3,Antlr,Antlr3,我正在为类C语言编写解析器/解释器,需要解释转义字符。其中一个是unicode转义序列,模式为“\uxxx”,其中X是一些十六进制数 我的ANTLR规则如下所示: public char returns [char c] : '\\"' { $c = '"'; } | '\\\\' { $c = '\\'; } | '\\/' { $c = '/'; } | '\\b' { $c = '\b'; } | '\\f' { $c = '\f'; }

我正在为类C语言编写解析器/解释器,需要解释转义字符。其中一个是unicode转义序列,模式为“\uxxx”,其中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”,但我得到的是一个“/”,这是其他所有内容的回退规则


是否有一些神奇的jujuju正在使用片段和规则或我不知道的东西?

正如Adam所提到的,
char
目前是一个解析器规则,但应该改为一个lexer规则,在这种情况下,您不能让它返回
char
(lexer规则总是返回
令牌的实例)

您可以使用标记的
setText(…)
方法调整标记的内部文本,如下所示(假设Java是目标语言):


片段应该只在lexer规则中使用,但“char”看起来像一个解析器规则。啊,对了,我把HEXNUMBER作为HEXDIGIT的四项序列。不知道为什么ANTLR不抱怨在这种情况下HEXDIGIT和DIGIT之间的重叠。。。
// 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')
  ;