This repository hosts the tree-sitter grammar for TQL, the Tenzir Query Language.
Features:
- π Complete syntax support for TQL pipelines, operators, and expressions
- π Proper handling of significant newlines and pipe separators
- π’ Support for all TQL literal types (strings, numbers, IPs, durations, etc.)
- π Control flow structures (if/else, match statements)
- π¦ Module paths and function calls
- π¬ Comments (line and block)
- π Indentation guidance for braces, pipelines, and collections via Tree-sitter indent queries
- π» Folding queries for blocks, match statements, and collection literals
- π§ Lambda parameters tracked for editor tooling via locals queries
The tenzir/zed-tql extension bundles the latest highlights and parser for TQL. Install it from the repository or through the Zed extensions view.
Lazy.nvim example that registers the parser and filetype. Tree-sitter queries
(highlights, indents, folds, locals) ship in queries/tql, so no extra build
step is
required:
Lazy.nvim example
return {
'nvim-treesitter/nvim-treesitter',
build = ':TSUpdate',
dependencies = {
'tenzir/tree-sitter-tql',
},
opts = function(_, opts)
opts.ensure_installed = {
'bash',
'c',
'comment',
'cpp',
'fish',
'json',
'lua',
'markdown',
'python',
'r',
'tql',
'yaml',
}
opts.highlight = {
enable = true,
additional_vim_regex_highlighting = true,
}
opts.incremental_selection = {
enable = true,
keymaps = {
init_selection = '<CR>',
scope_incremental = '<CR>',
node_incremental = '<TAB>',
node_decremental = '<S-TAB>',
},
}
return opts
end,
config = function(_, opts)
local parser_config = require('nvim-treesitter.parsers').get_parser_configs()
parser_config.tql = {
install_info = {
url = 'https://github.com/tenzir/tree-sitter-tql',
files = { 'src/parser.c' },
branch = 'main',
},
filetype = 'tql',
}
require('nvim-treesitter.configs').setup(opts)
vim.filetype.add({ extension = { tql = 'tql' } })
end,
}Contributions are welcome! π
-
Clone the repository and install dependencies:
git clone https://github.com/tenzir/tree-sitter-tql cd tree-sitter-tql npm install -
Regenerate the parser (and highlights) when needed:
npm run generate
Note
Highlights, indentation, folding, and locals queries stay in sync because
they are generated and committed alongside the parser. CI re-runs the
generator and fails if the checked-in files would change, so always execute
npm run generate after touching the grammar or related constants.
The grammar includes a comprehensive test suite in the test/corpus/ directory:
- Run all tests:
npx tree-sitter test - Run a specific test:
npx tree-sitter test --include "Simple assignment" - Run a test corpus file:
npx tree-sitter test test/corpus/statements.txt - Update expectations:
npx tree-sitter test --update - Run Node binding tests:
npm test
The grammar is defined in grammar.js. To regenerate the parser after grammar
changes:
npx tree-sitter generate
npx tree-sitter testTo interactively test the grammar:
npm run start
# or
npx tree-sitter playgroundThis opens a web interface where you can input TQL code and see the parse tree in real time.
Contributions are welcome! Please ensure:
- All tests pass (
npx tree-sitter test). - New features include test cases.
- Grammar changes are documented.
- GitHub Actions runs the
CIworkflow on pushes and pull requests touching the grammar, bindings, or examples. - The matrix covers Linux, macOS, and Windows runners to exercise parser generation and binding smoke tests for Rust, Node.js, Python, Go, and Swift.
- Example pipelines in
examples/**are parsed to provide quick coverage feedback. - Scanner fuzzing is triggered automatically whenever
src/scanner.cchanges.
- Pushing a tag (for example
v0.3.0) triggers thePublish packagesworkflow. - The workflow generates a GitHub release with source and Wasm artifacts, then builds and publishes wheels and an sdist to PyPI.
- Configure a repository secret
PYPI_API_TOKEN(optionally scoped to apypienvironment) containing an API token created at https://pypi.org/manage/account/token. - Follow the tree-sitter publishing guide: update the version with
tree-sitter version, commit, tag, and push the tag to run the release pipeline. - npm and crates.io publishing steps can be added later by extending the workflow with
package-npm.ymlorpackage-crates.ymlfrom tree-sitter/workflows.
This project is licensed under the MIT License.