CppLexer: Support raw string literals

Handles prefixes and delimiters (`R"(text)", `u8R"f(text)f"`, ...).
This commit is contained in:
Nico Weber 2020-07-26 20:49:17 -04:00 committed by Andreas Kling
parent 4d783338c1
commit 9ee1edae2a
Notes: sideshowbarker 2024-07-19 04:34:28 +09:00
3 changed files with 24 additions and 0 deletions

View file

@ -636,6 +636,28 @@ Vector<CppToken> CppLexer::lex()
commit_token(CppToken::Type::DoubleQuotedString);
continue;
}
if (size_t prefix = match_string_prefix('R'); prefix > 0 && peek(prefix) == '"') {
begin_token();
for (size_t i = 0; i < prefix + 1; ++i)
consume();
size_t prefix_start = m_index;
while (peek() && peek() != '(')
consume();
StringView prefix_string = m_input.substring_view(prefix_start, m_index - prefix_start);
while (peek()) {
if (consume() == '"') {
ASSERT(m_index >= prefix_string.length() + 2);
ASSERT(m_input[m_index - 1] == '"');
if (m_input[m_index - 1 - prefix_string.length() - 1] == ')') {
StringView suffix_string = m_input.substring_view(m_index - 1 - prefix_string.length(), prefix_string.length());
if (prefix_string == suffix_string)
break;
}
}
}
commit_token(CppToken::Type::DoubleQuotedString);
continue;
}
if (size_t prefix = match_string_prefix('\''); prefix > 0) {
begin_token();
for (size_t i = 0; i < prefix; ++i)

View file

@ -89,6 +89,7 @@ namespace GUI {
__TOKEN(ArrowAsterisk) \
__TOKEN(DoubleQuotedString) \
__TOKEN(SingleQuotedString) \
__TOKEN(RawString) \
__TOKEN(EscapeSequence) \
__TOKEN(Comment) \
__TOKEN(Integer) \

View file

@ -43,6 +43,7 @@ static TextStyle style_for_token_type(Gfx::Palette palette, CppToken::Type type)
return { palette.syntax_identifier() };
case CppToken::Type::DoubleQuotedString:
case CppToken::Type::SingleQuotedString:
case CppToken::Type::RawString:
return { palette.syntax_string() };
case CppToken::Type::Integer:
case CppToken::Type::Float: