Есть ли где-нибудь спецификация jflex для строковых литералов java? - PullRequest
2 голосов
/ 02 февраля 2010

И под строковыми литералами я имею в виду те, которые содержат \123 -подобные символы. Я написал что-то, но не знаю, идеально ли это:

<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 -подобные символы, я не помещаю сам символ в строку, а вместо этого его представление. Я могу попытаться преобразовать его, используя методы символов, но тогда, возможно, я не исчерпывающий, может быть, есть другие escape-последовательности, которые я не обработал ... так что, если есть канонический файл jflex, для него это было бы идеально.

Ответы [ 2 ]

2 голосов
/ 07 октября 2010

Да. Загрузите JFlex и посмотрите файлы examples/java/java.flex. Он содержит определения в синтаксисе JFlex для всех лексических компонентов языка Java.

Приветствие.

2 голосов
/ 18 февраля 2010

Если посмотреть на JLS, параграф 3.10.5 Строковые литералы , он определяет строковые литералы следующим образом:

    StringLiteral:
      " StringCharacters* "

    StringCharacters:
      StringCharacter
      StringCharacters StringCharacter

    StringCharacter:
      InputCharacter but not " or \
      EscapeSequence

, где EscapeSequence определено в 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

Обратите внимание, что \' также является допустимой escape-последовательностью в литерале String, и в настоящий момент вы все еще пропускаете пару escape-последовательностей. Вы также можете учесть экранирование Unicode, которое может присутствовать в исходных файлах Java (и, следовательно, в литералах String): \u HEX HEX HEX HEX, где HEX - это один из 0-9 | A-F.

...