#include "tree_sitter/alloc.h"
#include "tree_sitter/parser.h"
enum TokenType
{
STRING_CONTENT,
ERROR_SENTINEL,
};
static inline bool process_string(TSLexer* lexer);
void* tree_sitter_cool_external_scanner_create()
{
return NULL;
}
void tree_sitter_cool_external_scanner_destroy()
{
}
unsigned tree_sitter_cool_external_scanner_serialize(void* payload,
char* buffer)
{
return 0;
}
void tree_sitter_cool_external_scanner_deserialize(void* payload,
const char* buffer,
unsigned length)
{
}
bool tree_sitter_cool_external_scanner_scan(void* payload, TSLexer* lexer,
const bool* valid_symbols)
{
if (valid_symbols[ERROR_SENTINEL]) {
return false;
}
if (valid_symbols[STRING_CONTENT]) {
return process_string(lexer);
}
return false;
}
static inline char advance(TSLexer* lexer)
{
lexer->advance(lexer, false);
return (char)lexer->lookahead;
}
static inline bool process_string(TSLexer* lexer)
{
bool has_content = false;
bool escape_char = false;
for (;;) {
if (lexer->lookahead == '\"') {
break;
}
if (lexer->eof(lexer)) {
return false;
}
has_content = true;
switch (advance(lexer)) {
case '\\':
escape_char = true;
break;
case '\n':
if (!escape_char) {
return false;
}
default:
escape_char = false;
break;
}
}
lexer->result_symbol = STRING_CONTENT;
lexer->mark_end(lexer);
return has_content;
}