如何在 Antlr 分词器中进行 Unicode 转义解码

Mic*_*hue 5 java antlr antlr3

我使用 AntlrWorks 创建了一个 antlr 语法,并创建了一个供内部使用的本地化工具。我想在解析时将 unicode 转义序列转换为实际的 Java 字符,但不确定执行此操作的最佳方法。这是我的语法中的标记定义。是否有某种方法可以为片段 UNICODE_ESC 指定一个操作,该操作将返回字符,而不是六个字符转义序列?

ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
    ;

INT :   '0'..'9'+
    ;

COMMENT
    :   '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}
    |   '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;}
    ;

WS  :   ( ' '
        | '\t'
        | '\r'
        | '\n'
        ) {$channel=HIDDEN;}
    ;

STRING
    :  '"' ( ESC_SEQ | ~('\\'|'"') )* '"'
    ;

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

fragment
ESC_SEQ
    :   '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
    |   UNICODE_ESC
    |   OCTAL_ESC
    ;

fragment
OCTAL_ESC
    :   '\\' ('0'..'3') ('0'..'7') ('0'..'7')
    |   '\\' ('0'..'7') ('0'..'7')
    |   '\\' ('0'..'7')
    ;

fragment
UNICODE_ESC
    :   '\\' 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT
    ;
Run Code Online (Sandbox Code Playgroud)

Bar*_*ers 0

迈克尔写道

这是在 Java 中,因此对于字符或字符串来说,表示不应该成为问题。

是的,但是在 Java 源文件中,Unicode 文字看起来是一样的......所以我不确定你的意思。

迈克尔写道

我只是想知道如何进行更换。如果它更容易,假设我想用字符“?”替换所有 UNICODE_ESC 片段 解析时。

好的,可以这样做:

Token : 'x' {setText("?");} ;
Run Code Online (Sandbox Code Playgroud)

其中Token与文字匹配x,然后用 重写?