#include "tree_sitter/parser.h"
enum TokenType {
FLOAT_LITERAL,
ERROR_SENTINEL, };
void *tree_sitter_qsharp_external_scanner_create(void) { return NULL; }
void tree_sitter_qsharp_external_scanner_destroy(void *payload) {
(void)payload;
}
unsigned tree_sitter_qsharp_external_scanner_serialize(void *payload,
char *buffer) {
(void)payload;
(void)buffer;
return 0;
}
void tree_sitter_qsharp_external_scanner_deserialize(void *payload,
const char *buffer,
unsigned length) {
(void)payload;
(void)buffer;
(void)length;
}
static inline void advance(TSLexer *lexer) { lexer->advance(lexer, false); }
static inline bool is_digit(int32_t c) {
return (c >= '0' && c <= '9') ? true : false;
}
static void skip_digits(TSLexer *lexer) {
while (!lexer->eof(lexer) &&
(is_digit(lexer->lookahead) || lexer->lookahead == '_')) {
advance(lexer);
}
}
static bool scan_exponent(TSLexer *lexer) {
if (lexer->eof(lexer)) {
return false;
}
if (lexer->lookahead != 'e' && lexer->lookahead != 'E') {
return false;
}
advance(lexer);
if (!lexer->eof(lexer) &&
(lexer->lookahead == '+' || lexer->lookahead == '-')) {
advance(lexer);
}
if (lexer->eof(lexer) || !is_digit(lexer->lookahead)) {
return false;
}
skip_digits(lexer);
return true;
}
bool tree_sitter_qsharp_external_scanner_scan(void *payload, TSLexer *lexer,
const bool *valid_symbols) {
(void)payload;
if (valid_symbols[ERROR_SENTINEL]) {
return false;
}
if (!valid_symbols[FLOAT_LITERAL]) {
return false;
}
while (!lexer->eof(lexer) &&
(lexer->lookahead == ' ' || lexer->lookahead == '\t' ||
lexer->lookahead == '\n' || lexer->lookahead == '\r')) {
lexer->advance(lexer, true);
}
if (lexer->eof(lexer) || !is_digit(lexer->lookahead)) {
return false;
}
skip_digits(lexer);
bool has_dot = false;
bool has_exp = false;
if (!lexer->eof(lexer) && lexer->lookahead == '.') {
lexer->mark_end(lexer);
advance(lexer);
if (lexer->lookahead == '.') {
return false; }
has_dot = true;
skip_digits(lexer);
}
has_exp = scan_exponent(lexer);
if (!has_dot && !has_exp) {
return false;
}
if (!lexer->eof(lexer) &&
(lexer->lookahead == 'i' || lexer->lookahead == 'L')) {
return false;
}
lexer->mark_end(lexer);
lexer->result_symbol = FLOAT_LITERAL;
return true;
}