FractionalConstant = (Digit* "." Digit+) | (Digit+ ".");
FloatingSuffix = [fF] [lL]? | [lL] [fF]?;
IntegerSuffix = [uU] [lL]? | [lL] [uU]?;
-LongIntegerSuffix = [uU] ([lL] [lL]) | ([lL] [lL]) [uU]?;
+LongIntegerSuffix = [uU] ("ll" | "LL") | ("ll" | "LL") [uU]?;
Backslash = [\\] | "??/";
EscapeSequence = Backslash ([abfnrtv?'"] | Backslash | "x" HexDigit+ | OctalDigit OctalDigit? OctalDigit?);
HexQuad = HexDigit HexDigit HexDigit HexDigit;
"case" { BOOST_WAVE_RET(T_CASE); }
"catch" { BOOST_WAVE_RET(T_CATCH); }
"char" { BOOST_WAVE_RET(T_CHAR); }
+ "char8_t" { BOOST_WAVE_RET(s->act_in_cpp2a_mode ? T_CHAR8_T : T_IDENTIFIER); }
"char16_t" { BOOST_WAVE_RET(s->act_in_cpp0x_mode ? T_CHAR16_T : T_IDENTIFIER); }
"char32_t" { BOOST_WAVE_RET(s->act_in_cpp0x_mode ? T_CHAR32_T : T_IDENTIFIER); }
"class" { BOOST_WAVE_RET(T_CLASS); }
+ "concept" { BOOST_WAVE_RET(s->act_in_cpp2a_mode ? T_CONCEPT : T_IDENTIFIER); }
"const" { BOOST_WAVE_RET(T_CONST); }
+ "consteval" { BOOST_WAVE_RET(s->act_in_cpp2a_mode ? T_CONSTEVAL : T_IDENTIFIER); }
"constexpr" { BOOST_WAVE_RET(s->act_in_cpp0x_mode ? T_CONSTEXPR : T_IDENTIFIER); }
+ "constinit" { BOOST_WAVE_RET(s->act_in_cpp2a_mode ? T_CONSTINIT : T_IDENTIFIER); }
"const_cast" { BOOST_WAVE_RET(T_CONSTCAST); }
"continue" { BOOST_WAVE_RET(T_CONTINUE); }
+ "co_await" { BOOST_WAVE_RET(s->act_in_cpp2a_mode ? T_CO_AWAIT : T_IDENTIFIER); }
+ "co_return" { BOOST_WAVE_RET(s->act_in_cpp2a_mode ? T_CO_RETURN : T_IDENTIFIER); }
+ "co_yield" { BOOST_WAVE_RET(s->act_in_cpp2a_mode ? T_CO_YIELD : T_IDENTIFIER); }
"decltype" { BOOST_WAVE_RET(s->act_in_cpp0x_mode ? T_DECLTYPE : T_IDENTIFIER); }
"default" { BOOST_WAVE_RET(T_DEFAULT); }
"delete" { BOOST_WAVE_RET(T_DELETE); }
"public" { BOOST_WAVE_RET(T_PUBLIC); }
"register" { BOOST_WAVE_RET(T_REGISTER); }
"reinterpret_cast" { BOOST_WAVE_RET(T_REINTERPRETCAST); }
+ "requires" { BOOST_WAVE_RET(s->act_in_cpp2a_mode ? T_REQUIRES : T_IDENTIFIER); }
"return" { BOOST_WAVE_RET(T_RETURN); }
"short" { BOOST_WAVE_RET(T_SHORT); }
"signed" { BOOST_WAVE_RET(T_SIGNED); }
"==" { BOOST_WAVE_RET(T_EQUAL); }
"!=" { BOOST_WAVE_RET(T_NOTEQUAL); }
"not_eq" { BOOST_WAVE_RET(s->act_in_c99_mode ? T_IDENTIFIER : T_NOTEQUAL_ALT); }
+ "<=>"
+ {
+ if (s->act_in_cpp2a_mode) {
+ BOOST_WAVE_RET(T_SPACESHIP);
+ }
+ else {
+ --YYCURSOR;
+ BOOST_WAVE_RET(T_LESSEQUAL);
+ }
+ }
"<=" { BOOST_WAVE_RET(T_LESSEQUAL); }
">=" { BOOST_WAVE_RET(T_GREATEREQUAL); }
"&&" { BOOST_WAVE_RET(T_ANDAND); }
/*!re2c
"."? Digit (Digit | NonDigit | ExponentStart | ".")*
{ BOOST_WAVE_RET(T_PP_NUMBER); }
+
+ * { BOOST_ASSERT(false); }
*/
}
else {
{ BOOST_WAVE_RET(T_FLOATLIT); }
Integer { goto integer_suffix; }
+
+ * { BOOST_ASSERT(false); }
*/
}
}
{ BOOST_WAVE_RET(T_INTLIT); }
*/
}
+
+ // re2c will complain about -Wmatch-empty-string above
+ // it's OK because we've already matched an integer
+ // and will return T_INTLIT
}
/* this subscanner is invoked for C++0x extended character literals */
extcharlit:
{
/*!re2c
+ * {
+ (*s->error_proc)(s, lexing_exception::generic_lexing_error,
+ "Invalid character in raw string delimiter ('%c')", yych);
+ }
+
((EscapeSequence | UniversalChar | any\[\n\r\\']) ['])
{ BOOST_WAVE_RET(T_CHARLIT); }
extstringlit:
{
/*!re2c
+ * {
+ (*s->error_proc)(s, lexing_exception::generic_lexing_error,
+ "Invalid character in raw string delimiter ('%c')", yych);
+ }
+
((EscapeSequence | UniversalChar | any\[\n\r\\"])* ["])
{ BOOST_WAVE_RET(T_STRINGLIT); }