C++ bindings for Tree-sitter.
#include "tree_sitter/cxx/api.h" using namespace TreeSitter; int main() { Parser parser(Language::C); auto tree = parser.parse("int a = 2;"); auto node = tree.rootNode() .firstChild().value(); .firstChild().value(); std::cout << node.text() << "\n"; // Should output "int" return 0; }Using it in CMake is as simple as:
find_package(Tree-Sitter CONFIG REQUIRED) add_library(main main.cpp) target_link_libraries(main PRIVATE Tree-Sitter::Tree-Sitter)The following languages are built-in:
- C
- C++
- C#
- Go
- Java
- JavaScript
- Python
- Rust
- TypeScript
- TSX
Any language can be added by passing a TSLanguage pointer to TreeSitter::Language().
TreeSitterPlusPlus has the following system requirements:
Build like any other CMake project:
cmake -B build -DENABLE_TESTS=ON cmake --build build To run tests, run this command after a successful build:
ctest -C Debug --test-dir build To install, run this:
cmake --build build --target install Can I use the regular C API?
Yes. You can use any of the regular Tree-sitter functions. In fact, tree_sitter/api.h is distributed along with tree_sitter/cxx/api.h. TreeSitterPlusPlus was made to make Tree-sitter easier to use, including distributing on vcpkg.
Why the heavy use of
std::optional?
It makes everything safer. A common problem with ASTs and syntax parsers is accessing null nodes. Instead of returning pointers, we return regular objects. Because of RAII, this is much more memory safe than entrusting the user not to access an invalid node.
Making your code a bit longer is a small price to pay for the extra safety this provides. std::optional is a modern C++17 feature that makes it much easier to write safer C++; let's use it.
Internally, this is also why classes store all private members inside a std::unique_ptr. Smart pointers are inherently safer.
Is TreeSitterPlusPlus thread-safe?
Not yet. Classes are not guaranteed to be any more thread-safe than the regular Tree-sitter functions.
Copyright (c) Alex Shaw.
Licensed under the MIT License.