2

また、文字列リテラルとは、の\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-like 文字を解析する 3 行では、文字自体を文字列に入れるのではなく、その表現を文字列に入れるからです。文字メソッドを使用して変換しようとするかもしれませんが、網羅的ではないかもしれません。処理しなかった他のエスケープシーケンスがあるかもしれません....そのための正規のjflexファイルがあれば完璧です。

4

2 に答える 2

2

はい。JFlexをダウンロードし、ファイルを参照してくださいexamples/java/java.flex。これには、Java言語のすべての字句コンポーネントに対するJFlex構文の定義があります。

乾杯。

于 2010-10-06T21:11:42.433 に答える
2

JLS のパラグラフ3.10.5 String Literalsを見ると、次のように文字列リテラルが定義されています。

    文字列リテラル:
      " StringCharacters* "

    文字列文字:
      文字列文字
      文字列文字列文字

    文字列文字:
      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: 8 進数値から */

    OctalEscape:
      \ 8 桁
      \ OctalDigit OctalDigit
      \ ZeroToThree OctalDigit OctalDigit

    OctalDigit: のいずれか
      0 1 2 3 4 5 6 7

    ZeroToThree: の 1 つ
      0 1 2 3

\'これも文字列リテラルの有効なエスケープ シーケンスであり、現時点ではまだいくつかのエスケープ シーケンスが欠けていることに注意してください。また、Java ソース ファイル (したがって、文字列リテラルにも) に存在する可能性がある Unicode エスケープを考慮したい場合も\u HEX HEX HEX HEXありHEXます0-9 | A-F

于 2010-02-18T09:35:08.387 に答える