某处有java字符串文字的jflex规范吗?

时间:2010-02-02 09:05:53

标签: java lexer jflex

字符串文字我指的是那些包含\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的三行 - 就像字符一样,我不会将字符本身放在字符串中,而是将其表示。 我可能尝试使用Character方法转换它,但是也许我并不详尽,也许还有其他的转义序列我没有处理....所以如果有一个规范的jflex文件,那将是完美的。< / p>

2 个答案:

答案 0 :(得分:2)

在查看JLS段落3.10.5 String Literals时,它定义了字符串文字,如下所示:

    StringLiteral:
      " StringCharacters* "

    StringCharacters:
      StringCharacter
      StringCharacters StringCharacter

    StringCharacter:
      InputCharacter but not " or \
      EscapeSequence

3.10.6中定义了EscapeSequence

    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

请注意,\'也是String文字中的有效转义序列,目前,您仍然会遗漏几个转义序列。您可能还想考虑可能存在于Java源文件中的Unicode转义(也因此也包括在字符串文字中):\u HEX HEX HEX HEX其中HEX0-9 | A-F之一。

答案 1 :(得分:2)

是。下载JFlex并查看文件examples/java/java.flex。它具有JFlex语法中用于Java语言的所有词法组件的定义。

干杯。