#include <tree_sitter/parser.h>
#include <wctype.h>
enum TokenType {
LONG_BUF_LIT,
LONG_STR_LIT
};
void* tree_sitter_janet_simple_external_scanner_create(
void
)
{
return NULL;
}
void tree_sitter_janet_simple_external_scanner_destroy(
void* payload
)
{
}
void tree_sitter_janet_simple_external_scanner_reset(
void* payload
)
{
}
unsigned tree_sitter_janet_simple_external_scanner_serialize(
void* payload,
char* buffer
)
{
return 0;
}
void tree_sitter_janet_simple_external_scanner_deserialize(
void *payload,
const char *buffer,
unsigned length
)
{
}
bool tree_sitter_janet_simple_external_scanner_scan(
void *payload,
TSLexer *lexer,
const bool *valid_symbols
)
{
while (iswspace(lexer->lookahead)) {
lexer->advance(lexer, true);
}
if (valid_symbols[LONG_BUF_LIT] || valid_symbols[LONG_STR_LIT]) {
if (lexer->lookahead == '@') {
lexer->result_symbol = LONG_BUF_LIT;
lexer->advance(lexer, false);
} else {
lexer->result_symbol = LONG_STR_LIT;
}
if (lexer->lookahead != '`') {
return false;
}
lexer->advance(lexer, false);
uint32_t n_backticks = 1;
for (;;) {
if (lexer->lookahead == 0) {
return false;
}
if (lexer->lookahead == '`') {
n_backticks++;
lexer->advance(lexer, false);
continue;
} else { lexer->advance(lexer, false);
break;
}
}
uint32_t cbt = 0; for (;;) {
if (lexer->lookahead == 0) {
return false;
}
if (lexer->lookahead == '`') {
cbt++;
if (cbt == n_backticks) {
lexer->advance(lexer, false);
return true;
}
} else { cbt = 0;
}
lexer->advance(lexer, false);
}
}
return false;
}