2010-02-02 45 views
2

而字符串文字我的意思是那些也包含\123的字符。 我寫的東西,但我不知道它是完美的:有沒有java字符串文字的jflex規範?

<STRING> { 
    \"        { yybegin(YYINITIAL); 
            return new Token(TokenType.STRING,string.toString()); } 
    \\[0-3][0-7][0-7]    { string.append(yytext()); } 
    \\[0-3][0-7]     { string.append(yytext()); } 
    \\[0-7]      { string.append(yytext()); } 
    [^\n\r\"\\]+     { string.append(yytext()); } 
    \\t       { string.append('\t'); } 
    \\n       { string.append('\n'); } 

    \\r       { string.append('\r'); } 
    \\\"       { string.append('\"'); } 
    \\        { string.append('\\'); } 
} 

其實,我知道這是不完美的,因爲對於三線解析\ddd般的人物,我不把字符本身在字符串中,但它的表示代替。 我可能會嘗試使用字符方法將其轉換,但也許我並不詳盡,也許還有其他轉義序列我沒有處理....所以如果有一個規範jflex文件,它將是完美的。

回答

2

當在JLS看,段3.10.5 String Literals,它定義字符串文字如下:

 
    StringLiteral: 
     " StringCharacters* " 

    StringCharacters: 
     StringCharacter 
     StringCharacters StringCharacter 

    StringCharacter: 
     InputCharacter but not " or \ 
     EscapeSequence 

其中一個EscapeSequence3.10.6定義:

 
    EscapeSequence: 
     \ b   /* \u0008: backspace BS */ 
     \ t   /* \u0009: horizontal tab HT */ 
     \ n   /* \u000a: linefeed LF */ 
     \ f   /* \u000c: form feed FF */ 
     \ r   /* \u000d: carriage return CR */ 
     \ "   /* \u0022: double quote " */ 
     \ '   /* \u0027: single quote ' */ 
     \ \   /* \u005c: backslash \ */ 
     OctalEscape /* \u0000 to \u00ff: from octal value */ 

    OctalEscape: 
     \ OctalDigit 
     \ OctalDigit OctalDigit 
     \ ZeroToThree OctalDigit OctalDigit 

    OctalDigit: one of 
     0 1 2 3 4 5 6 7 

    ZeroToThree: one of 
     0 1 2 3 

注意\'也是一個有效的逃生序列在一個字符串文字中,此刻,你仍然會錯過一些轉義序列。您可能還需要考慮可能存在於Java源文件中的Unicode轉義(以及String字面值):\u HEX HEX HEX HEX其中HEX0-9 | A-F之一。

1

是的。下載JFlex並查看文件examples/java/java.flex。它具有JFlex語法中用於Java語言的所有詞彙組件的定義。

乾杯。