tree-sitter-ebnf 0.1.0

EBNF grammar for the tree-sitter parsing library
Documentation
  • Coverage
  • 75%
    3 out of 4 items documented1 out of 2 items with examples
  • Size
  • Source code size: 51.02 kB This is the summed size of all the files inside the crates.io package for this release.
  • Documentation size: 634.95 kB This is the summed size of all files generated by rustdoc for all configured targets
  • Ø build duration
  • this release: 22s Average build duration of successful builds.
  • all releases: 22s Average build duration of successful builds in releases after 2024-10-23.
  • Links
  • RubixDev/ebnf
    11 0 0
  • crates.io
  • Dependencies
  • Versions
  • Owners
  • RubixDev

tree-sitter-ebnf

EBNF grammar for tree-sitter

Reference

This parser implements the EBNF syntax as described by the ISO/IEC 14977:1996 standard with two notable differences:

  1. The ISO standard does not allow underscores _ in meta-identifiers
  2. The ISO standard only allows characters from the ISO/IEC 646:1991 character set

Usage in Neovim

Parser Installation

The nvim-treesitter plugin does not include this parser currently. To use it you must instead manually add it to your tree-sitter config and then install it with :TSInstall ebnf or by adding it to your ensure_installed list:

require('nvim-treesitter.parsers').get_parser_configs().ebnf = {
    install_info = {
        url = 'https://github.com/RubixDev/ebnf.git',
        files = { 'src/parser.c' },
        location = 'crates/tree-sitter-ebnf',
        branch = 'main',
    },
}

File type detection

You will likely also have to add the ebnf file type:

vim.filetype.add { extension = { ebnf = 'ebnf' } }

Highlighting

If you want to use this parser for highlighting, you will also have to add the contents of queries/highlights.scm to a file called queries/ebnf/highlights.scm in your Neovim runtime path (see :help rtp). I also recommend customizing these highlights:

  • @string.grammar: terminal symbols enclosed with ' or ", falls back to @string
  • @string.special.grammar: special sequences enclosed with ?, falls back to @string.special
  • @variable.grammar: non-terminal symbols, i.e., identifiers, falls back to @variable
    • @variable.grammar.pascal: non-terminal symbols in PascalCase
    • @variable.grammar.camel: non-terminal symbols in camelCase
    • @variable.grammar.upper: non-terminal symbols in UPPERCASE
    • @variable.grammar.lower: non-terminal symbols in lowercase

As an example, here is my personal configuration:

vim.api.nvim_set_hl(0, '@string.special.grammar', { link = '@string.regex' })
vim.api.nvim_set_hl(0, '@variable.grammar.pascal', { link = '@type' })
vim.api.nvim_set_hl(0, '@variable.grammar.camel', { link = '@property' })
vim.api.nvim_set_hl(0, '@variable.grammar.upper', { link = '@constant' })
vim.api.nvim_set_hl(0, '@variable.grammar.lower', { link = '@parameter' })