#include "tree_sitter/parser.h"
enum TokenType {
MARKER_WS,
STRICT_EOL,
STRIPPED_CLOSE,
VERBATIM_CLOSE,
};
void *tree_sitter_ktav_external_scanner_create(void) {
return NULL;
}
void tree_sitter_ktav_external_scanner_destroy(void *payload) {
(void)payload;
}
unsigned tree_sitter_ktav_external_scanner_serialize(void *payload, char *buffer) {
(void)payload;
(void)buffer;
return 0;
}
void tree_sitter_ktav_external_scanner_deserialize(void *payload, const char *buffer, unsigned length) {
(void)payload;
(void)buffer;
(void)length;
}
static inline bool is_h_ws(int32_t c) {
return c == ' ' || c == '\t';
}
static bool consume_line_terminator(TSLexer *lexer) {
while (is_h_ws(lexer->lookahead)) {
lexer->advance(lexer, false);
}
int32_t c = lexer->lookahead;
if (c == '\n') {
lexer->advance(lexer, false);
lexer->mark_end(lexer);
return true;
}
if (c == '\r') {
lexer->advance(lexer, false);
if (lexer->lookahead == '\n') {
lexer->advance(lexer, false);
}
lexer->mark_end(lexer);
return true;
}
if (c == 0) {
lexer->mark_end(lexer);
return true;
}
return false;
}
bool tree_sitter_ktav_external_scanner_scan(void *payload, TSLexer *lexer, const bool *valid_symbols) {
(void)payload;
lexer->mark_end(lexer);
if (valid_symbols[MARKER_WS]) {
int32_t c = lexer->lookahead;
if (c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == 0) {
lexer->mark_end(lexer);
lexer->result_symbol = MARKER_WS;
return true;
}
return false;
}
if (valid_symbols[VERBATIM_CLOSE]) {
while (is_h_ws(lexer->lookahead)) {
lexer->advance(lexer, false);
}
if (lexer->lookahead == ')') {
lexer->advance(lexer, false);
if (lexer->lookahead == ')') {
lexer->advance(lexer, false);
if (consume_line_terminator(lexer)) {
lexer->result_symbol = VERBATIM_CLOSE;
return true;
}
}
}
return false;
}
if (valid_symbols[STRIPPED_CLOSE]) {
while (is_h_ws(lexer->lookahead)) {
lexer->advance(lexer, false);
}
if (lexer->lookahead == ')') {
lexer->advance(lexer, false);
if (lexer->lookahead != ')') {
if (consume_line_terminator(lexer)) {
lexer->result_symbol = STRIPPED_CLOSE;
return true;
}
}
}
return false;
}
if (valid_symbols[STRICT_EOL]) {
while (is_h_ws(lexer->lookahead)) {
lexer->advance(lexer, false);
}
int32_t c = lexer->lookahead;
if (c == '\n') {
lexer->advance(lexer, false);
lexer->mark_end(lexer);
lexer->result_symbol = STRICT_EOL;
return true;
}
if (c == '\r') {
lexer->advance(lexer, false);
if (lexer->lookahead == '\n') {
lexer->advance(lexer, false);
}
lexer->mark_end(lexer);
lexer->result_symbol = STRICT_EOL;
return true;
}
if (c == 0) {
lexer->mark_end(lexer);
lexer->result_symbol = STRICT_EOL;
return true;
}
}
return false;
}