refactor: use C for the external scanner (#16)
This commit is contained in:
parent
4e210a9ca6
commit
aafadc0d65
|
@ -9,7 +9,7 @@
|
||||||
"sources": [
|
"sources": [
|
||||||
"bindings/node/binding.cc",
|
"bindings/node/binding.cc",
|
||||||
"src/parser.c",
|
"src/parser.c",
|
||||||
# If your language uses an external scanner, add it here.
|
"scanner.c",
|
||||||
],
|
],
|
||||||
"cflags_c": [
|
"cflags_c": [
|
||||||
"-std=c99",
|
"-std=c99",
|
||||||
|
|
|
@ -10,29 +10,10 @@ fn main() {
|
||||||
let parser_path = src_dir.join("parser.c");
|
let parser_path = src_dir.join("parser.c");
|
||||||
c_config.file(&parser_path);
|
c_config.file(&parser_path);
|
||||||
|
|
||||||
// If your language uses an external scanner written in C,
|
|
||||||
// then include this block of code:
|
|
||||||
|
|
||||||
/*
|
|
||||||
let scanner_path = src_dir.join("scanner.c");
|
let scanner_path = src_dir.join("scanner.c");
|
||||||
c_config.file(&scanner_path);
|
c_config.file(&scanner_path);
|
||||||
println!("cargo:rerun-if-changed={}", scanner_path.to_str().unwrap());
|
println!("cargo:rerun-if-changed={}", scanner_path.to_str().unwrap());
|
||||||
*/
|
|
||||||
|
|
||||||
c_config.compile("parser");
|
c_config.compile("parser");
|
||||||
println!("cargo:rerun-if-changed={}", parser_path.to_str().unwrap());
|
println!("cargo:rerun-if-changed={}", parser_path.to_str().unwrap());
|
||||||
|
|
||||||
// If your language uses an external scanner written in C++,
|
|
||||||
// then include this block of code:
|
|
||||||
|
|
||||||
let mut cpp_config = cc::Build::new();
|
|
||||||
cpp_config.cpp(true);
|
|
||||||
cpp_config.include(&src_dir);
|
|
||||||
cpp_config
|
|
||||||
.flag_if_supported("-Wno-unused-parameter")
|
|
||||||
.flag_if_supported("-Wno-unused-but-set-variable");
|
|
||||||
let scanner_path = src_dir.join("scanner.cc");
|
|
||||||
cpp_config.file(&scanner_path);
|
|
||||||
cpp_config.compile("scanner");
|
|
||||||
println!("cargo:rerun-if-changed={}", scanner_path.to_str().unwrap());
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,16 +1,19 @@
|
||||||
#include <cwctype>
|
|
||||||
#include <tree_sitter/parser.h>
|
#include <tree_sitter/parser.h>
|
||||||
|
#include <wctype.h>
|
||||||
|
|
||||||
namespace {
|
|
||||||
enum TokenType { BRACKET_ARGUMENT, BRACKET_COMMENT, LINE_COMMENT };
|
enum TokenType { BRACKET_ARGUMENT, BRACKET_COMMENT, LINE_COMMENT };
|
||||||
void skip(TSLexer *lexer) { lexer->advance(lexer, true); }
|
|
||||||
void advance(TSLexer *lexer) { lexer->advance(lexer, false); }
|
static void skip(TSLexer *lexer) { lexer->advance(lexer, true); }
|
||||||
void skip_wspace(TSLexer *lexer) {
|
|
||||||
while (std::iswspace(lexer->lookahead)) {
|
static void advance(TSLexer *lexer) { lexer->advance(lexer, false); }
|
||||||
|
|
||||||
|
static void skip_wspace(TSLexer *lexer) {
|
||||||
|
while (iswspace(lexer->lookahead)) {
|
||||||
skip(lexer);
|
skip(lexer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bool is_bracket_argument(TSLexer *lexer) {
|
|
||||||
|
static bool is_bracket_argument(TSLexer *lexer) {
|
||||||
if (lexer->lookahead != '[') {
|
if (lexer->lookahead != '[') {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -45,7 +48,8 @@ bool is_bracket_argument(TSLexer *lexer) {
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
bool scan(void *payload, TSLexer *lexer, bool const *valid_symbols) {
|
|
||||||
|
static bool scan(void *payload, TSLexer *lexer, bool const *valid_symbols) {
|
||||||
skip_wspace(lexer);
|
skip_wspace(lexer);
|
||||||
|
|
||||||
if (lexer->lookahead != '#' && valid_symbols[BRACKET_ARGUMENT]) {
|
if (lexer->lookahead != '#' && valid_symbols[BRACKET_ARGUMENT]) {
|
||||||
|
@ -72,19 +76,20 @@ bool scan(void *payload, TSLexer *lexer, bool const *valid_symbols) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
|
||||||
extern "C" {
|
|
||||||
void *tree_sitter_cmake_external_scanner_create() { return NULL; }
|
void *tree_sitter_cmake_external_scanner_create() { return NULL; }
|
||||||
|
|
||||||
void tree_sitter_cmake_external_scanner_destroy(void *payload) {}
|
void tree_sitter_cmake_external_scanner_destroy(void *payload) {}
|
||||||
|
|
||||||
unsigned tree_sitter_cmake_external_scanner_serialize(void *payload,
|
unsigned tree_sitter_cmake_external_scanner_serialize(void *payload,
|
||||||
char *buffer) {
|
char *buffer) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void tree_sitter_cmake_external_scanner_deserialize(void *payload,
|
void tree_sitter_cmake_external_scanner_deserialize(void *payload,
|
||||||
char const *buffer,
|
char const *buffer,
|
||||||
unsigned length) {}
|
unsigned length) {}
|
||||||
|
|
||||||
bool tree_sitter_cmake_external_scanner_scan(void *payload, TSLexer *lexer,
|
bool tree_sitter_cmake_external_scanner_scan(void *payload, TSLexer *lexer,
|
||||||
bool const *valid_symbols) {
|
bool const *valid_symbols) {
|
||||||
return scan(payload, lexer, valid_symbols);
|
return scan(payload, lexer, valid_symbols);
|
||||||
}
|
}
|
||||||
}
|
|
Loading…
Reference in a new issue