refactor: use C for the external scanner (#16)

This commit is contained in:
Amaan Qureshi 2023-06-18 10:44:07 -04:00 committed by GitHub
parent 4e210a9ca6
commit aafadc0d65
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 17 additions and 31 deletions

View file

@ -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",

View file

@ -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());
} }

View file

@ -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);
} }
}