From aafadc0d657faa99e483a4f2c70dbe64491b1802 Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Sun, 18 Jun 2023 10:44:07 -0400 Subject: [PATCH] refactor: use C for the external scanner (#16) --- binding.gyp | 2 +- bindings/rust/build.rs | 19 ------------------- src/{scanner.cc => scanner.c} | 27 ++++++++++++++++----------- 3 files changed, 17 insertions(+), 31 deletions(-) rename src/{scanner.cc => scanner.c} (84%) diff --git a/binding.gyp b/binding.gyp index a2beb8a..634f20f 100644 --- a/binding.gyp +++ b/binding.gyp @@ -9,7 +9,7 @@ "sources": [ "bindings/node/binding.cc", "src/parser.c", - # If your language uses an external scanner, add it here. + "scanner.c", ], "cflags_c": [ "-std=c99", diff --git a/bindings/rust/build.rs b/bindings/rust/build.rs index 618e90a..8f87ee6 100644 --- a/bindings/rust/build.rs +++ b/bindings/rust/build.rs @@ -10,29 +10,10 @@ fn main() { let parser_path = src_dir.join("parser.c"); 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"); c_config.file(&scanner_path); println!("cargo:rerun-if-changed={}", scanner_path.to_str().unwrap()); - */ c_config.compile("parser"); 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()); } diff --git a/src/scanner.cc b/src/scanner.c similarity index 84% rename from src/scanner.cc rename to src/scanner.c index 886bb33..d03a911 100644 --- a/src/scanner.cc +++ b/src/scanner.c @@ -1,16 +1,19 @@ -#include #include +#include -namespace { enum TokenType { BRACKET_ARGUMENT, BRACKET_COMMENT, LINE_COMMENT }; -void skip(TSLexer *lexer) { lexer->advance(lexer, true); } -void advance(TSLexer *lexer) { lexer->advance(lexer, false); } -void skip_wspace(TSLexer *lexer) { - while (std::iswspace(lexer->lookahead)) { + +static void skip(TSLexer *lexer) { lexer->advance(lexer, true); } + +static void advance(TSLexer *lexer) { lexer->advance(lexer, false); } + +static void skip_wspace(TSLexer *lexer) { + while (iswspace(lexer->lookahead)) { skip(lexer); } } -bool is_bracket_argument(TSLexer *lexer) { + +static bool is_bracket_argument(TSLexer *lexer) { if (lexer->lookahead != '[') { return false; } @@ -45,7 +48,8 @@ bool is_bracket_argument(TSLexer *lexer) { } 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); if (lexer->lookahead != '#' && valid_symbols[BRACKET_ARGUMENT]) { @@ -72,19 +76,20 @@ bool scan(void *payload, TSLexer *lexer, bool const *valid_symbols) { return false; } -} // namespace -extern "C" { void *tree_sitter_cmake_external_scanner_create() { return NULL; } + 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, char const *buffer, unsigned length) {} + bool tree_sitter_cmake_external_scanner_scan(void *payload, TSLexer *lexer, bool const *valid_symbols) { return scan(payload, lexer, valid_symbols); } -}