4

AntlrWorks を使用して antlr 文法を作成し、内部使用のためのローカリゼーション ツールを作成しました。解析中に Unicode エスケープ シーケンスを実際の Java 文字に変換したいのですが、これを行う最善の方法がわかりません。これが私の文法でのトークン定義です。フラグメント UNICODE_ESC に対して、6 文字のエスケープ シーケンスの代わりに文字を返すアクションを指定する方法はありますか?

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("?");} ;

ここTokenで、はリテラルxと一致し、その後、で書き換えられ?ます。

于 2010-10-02T07:25:44.753 に答える