字符串文字我指的是那些包含\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>
答案 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
其中HEX
是0-9 | A-F
之一。
答案 1 :(得分:2)
是。下载JFlex并查看文件examples/java/java.flex
。它具有JFlex语法中用于Java语言的所有词法组件的定义。
干杯。