in tree-sitter-ccomment/src/scanner.cc [15:72]
bool scan(TSLexer *lexer, const bool *valid_symbols) {
while (iswspace(lexer->lookahead)) {
lexer->advance(lexer, true);
}
lexer->result_symbol = RAW_STRING_LITERAL;
// Consume 'R'
if (lexer->lookahead != 'R') return false;
lexer->advance(lexer, false);
// Consume '"'
if (lexer->lookahead != '"') return false;
lexer->advance(lexer, false);
// Consume '(', delimiter
wstring delimiter;
for (;;) {
if (lexer->lookahead == 0 || lexer->lookahead == '\\' || iswspace(lexer->lookahead)) {
return false;
}
if (lexer->lookahead == '(') {
lexer->advance(lexer, false);
break;
}
delimiter += lexer->lookahead;
lexer->advance(lexer, false);
}
// Consume content, delimiter, ')', '"'
int delimiter_index = -1;
for (;;) {
if (lexer->lookahead == 0) return false;
if (delimiter_index >= 0) {
if (static_cast<unsigned>(delimiter_index) == delimiter.size()) {
if (lexer->lookahead == '"') {
lexer->advance(lexer, false);
return true;
} else {
delimiter_index = -1;
}
} else {
if (lexer->lookahead == delimiter[delimiter_index]) {
delimiter_index++;
} else {
delimiter_index = -1;
}
}
}
if (delimiter_index == -1 && lexer->lookahead == ')') {
delimiter_index = 0;
}
lexer->advance(lexer, false);
}
}