2010-02-02 3 views
2

Et par littéraux chaîne, je veux dire ceux qui contiennent \123 aussi des caractères. J'ai écrit quelque chose, mais je ne sais pas s'il est parfait:Existe-t-il une spécification jflex des littéraux de chaîne Java quelque part?

<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('\\'); } 
} 

En fait, je sais que ce n'est pas parfait, puisque pour les trois lignes d'analyse syntaxique \ddd -comme caractères, je ne mets pas le caractère lui-même dans la chaîne, mais sa représentation à la place. Je peux essayer de le convertir en utilisant des méthodes de caractères, mais peut-être que je ne suis pas exhaustif, peut-être qu'il y a d'autres séquences d'échappement que je n'ai pas traitées ... donc s'il y a un fichier canonique.

Répondre

2

En regardant le JLS, paragraphe 3.10.5 String Literals, il définit littéraux de chaîne comme suit:

 
    StringLiteral: 
     " StringCharacters* " 

    StringCharacters: 
     StringCharacter 
     StringCharacters StringCharacter 

    StringCharacter: 
     InputCharacter but not " or \ 
     EscapeSequence 

où un EscapeSequence est défini dans 3.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 

Notez que \' est aussi une évasion valide séquence dans un littéral String et pour le moment, vous manquez encore quelques séquences d'échappement. Vous pouvez également tenir compte des échappements Unicode pouvant être présents dans les fichiers source Java (et donc dans les littéraux String): \u HEX HEX HEX HEXHEX est l'un des 0-9 | A-F.

1

Oui. Télécharger JFlex et voir les fichiers examples/java/java.flex. Il a les définitions dans la syntaxe JFlex pour tous les composants lexicaux du langage Java.

Vive.

Questions connexes