Как сделать экранирование Unicode в токенайзере Antlr - PullRequest
3 голосов
/ 01 октября 2010

Я создал грамматику antlr с помощью AntlrWorks и создал инструмент локализации для внутреннего использования. Я хотел бы преобразовать escape-последовательности Юникода в реальный символ Java во время синтаксического анализа, но не уверен, что это лучший способ сделать это. Вот определения токенов в моей грамматике. Есть ли способ указать действие для фрагмента UNICODE_ESC, которое бы возвращало символ вместо escape-последовательности из шести символов?

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
    ;

1 Ответ

1 голос
/ 02 октября 2010

Майкл написал :

Это на Java, поэтому представление не должно быть проблемой для символов или строк.

Да, нов исходном файле Java литералы Unicode выглядят точно так же ... Так что я не уверен, что вы имеете в виду.

Майкл написал :

IМне просто интересно, как сделать замену.Если это облегчает задачу, скажем, я хочу заменить все фрагменты UNICODE_ESC символом '?'при разборе.

Хорошо, это можно сделать так:

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

, где Token соответствует литералу x и затем переписывается с ?.

...