2021-06-25 20:18:08 -04:00
|
|
|
#include <cwctype>
|
|
|
|
#include <iostream>
|
|
|
|
#include <tree_sitter/parser.h>
|
|
|
|
|
|
|
|
namespace {
|
2021-06-26 16:52:19 -04:00
|
|
|
enum TokenType { BRACKET_ARGUMENT, LINE_COMMENT };
|
2021-06-25 20:18:08 -04:00
|
|
|
void skip(TSLexer *lexer) { lexer->advance(lexer, true); }
|
|
|
|
void advance(TSLexer *lexer) { lexer->advance(lexer, false); }
|
2021-06-26 16:52:19 -04:00
|
|
|
bool scan_bracket_argument(TSLexer *lexer) {
|
|
|
|
while (std::iswspace(lexer->lookahead))
|
2021-06-25 20:18:08 -04:00
|
|
|
skip(lexer);
|
|
|
|
|
|
|
|
if (lexer->lookahead != '[')
|
|
|
|
return false;
|
|
|
|
|
|
|
|
advance(lexer);
|
|
|
|
|
|
|
|
int open_level = 0;
|
|
|
|
while (lexer->lookahead == '=') {
|
|
|
|
++open_level;
|
|
|
|
advance(lexer);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (lexer->lookahead != '[')
|
|
|
|
return false;
|
|
|
|
|
|
|
|
while (lexer->lookahead != '\0') {
|
|
|
|
advance(lexer);
|
|
|
|
if (lexer->lookahead == ']') {
|
|
|
|
advance(lexer);
|
|
|
|
|
|
|
|
int close_level = 0;
|
|
|
|
while (lexer->lookahead == '=') {
|
|
|
|
++close_level;
|
|
|
|
advance(lexer);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (lexer->lookahead == ']' && close_level == open_level) {
|
|
|
|
advance(lexer);
|
|
|
|
lexer->result_symbol = BRACKET_ARGUMENT;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2021-06-26 16:52:19 -04:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
bool scan(void *payload, TSLexer *lexer, const bool *valid_symbols) {
|
|
|
|
if (valid_symbols[BRACKET_ARGUMENT])
|
|
|
|
return scan_bracket_argument(lexer);
|
2021-06-25 20:18:08 -04:00
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace
|
|
|
|
extern "C" {
|
|
|
|
void *tree_sitter_cmake_external_scanner_create() { return nullptr; }
|
|
|
|
void tree_sitter_cmake_external_scanner_destroy(void *payload) {}
|
|
|
|
unsigned tree_sitter_cmake_external_scanner_serialize(void *payload,
|
|
|
|
char *buffer) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
void tree_sitter_cmake_external_scanner_deserialize(void *payload,
|
|
|
|
const char *buffer,
|
|
|
|
unsigned length) {}
|
|
|
|
bool tree_sitter_cmake_external_scanner_scan(void *payload, TSLexer *lexer,
|
|
|
|
const bool *valid_symbols) {
|
|
|
|
return scan(payload, lexer, valid_symbols);
|
|
|
|
}
|
|
|
|
}
|