4

我使用 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
    ;
4

1 回答 1

1

迈克尔写道

这是在 Java 中,所以表示不应该是字符或字符串的问题。

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

迈克尔写道

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

好的,可以这样完成:

Token : 'x' {setText("?");} ;

whereToken匹配文字x,然后用?.

于 2010-10-02T07:25:44.753 回答