2

我所说的字符串文字是指那些\123也包含 -like 字符的文字。我写了一些东西,但我不知道它是否完美:

<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 文件,那将是完美的。

4

2 回答 2

2

查看 JLS 第3.10.5 段字符串文字时,它定义字符串文字如下:

    字符串字面量:
      “字符串字符*”

    字符串字符:
      字符串字符
      字符串字符 字符串字符

    字符串字符:
      InputCharacter 但不是 " 或 \
      转义序列

其中 anEscapeSequence3.10.6中定义:

    转义序列:
      \ b /* \u0008: 退格 BS */
      \t /* \u0009: 水平制表符 HT */
      \n /* \u000a: 换行 LF */
      \f /* \u000c: 换页 FF */
      \r /* \u000d: 回车CR */
      \ " /* \u0022: 双引号 " */
      \ ' /* \u0027: 单引号 ' */
      \ \ /* \u005c: 反斜杠 \ */
      OctalEscape /* \u0000 到 \u00ff: 从八进制值 */

    八进制转义:
      \八进制数
      \ 八进制数字
      \ 零到三八位数字八位数字

    OctalDigit:其中之一
      0 1 2 3 4 5 6 7

    ZeroToThree:其中之一
      0 1 2 3

请注意,这\'也是字符串文字中的有效转义序列,目前,您仍然错过了几个转义序列。您可能还想考虑可能出现在 Java 源文件中的 Unicode 转义(因此也出现在字符串文字中):\u HEX HEX HEX HEX其中HEX之一是0-9 | A-F.

于 2010-02-18T09:35:08.387 回答
2

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

干杯。

于 2010-10-06T21:11:42.433 回答