From b809c1db8dcc0bd57435905e1a74b4024cb4ef88 Mon Sep 17 00:00:00 2001 From: Jooris Hadeler Date: Thu, 23 Apr 2026 18:52:34 +0200 Subject: [PATCH] init: this is the inital commit --- .gitignore | 1 + example.ebnf | 2 ++ extension.toml | 13 ++++++++++++ languages/ebnf/brackets.scm | 15 ++++++++++++++ languages/ebnf/config.toml | 15 ++++++++++++++ languages/ebnf/highlights.scm | 37 +++++++++++++++++++++++++++++++++++ languages/ebnf/outline.scm | 3 +++ 7 files changed, 86 insertions(+) create mode 100644 .gitignore create mode 100644 example.ebnf create mode 100644 extension.toml create mode 100644 languages/ebnf/brackets.scm create mode 100644 languages/ebnf/config.toml create mode 100644 languages/ebnf/highlights.scm create mode 100644 languages/ebnf/outline.scm diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b05eeea --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +grammars/ diff --git a/example.ebnf b/example.ebnf new file mode 100644 index 0000000..58503df --- /dev/null +++ b/example.ebnf @@ -0,0 +1,2 @@ +expr = term { ( "+" | "-" ) term } ; +term = number { ( "*" | "/" ) number } ; diff --git a/extension.toml b/extension.toml new file mode 100644 index 0000000..65a8963 --- /dev/null +++ b/extension.toml @@ -0,0 +1,13 @@ +id = "ebnf" +name = "EBNF" +version = "0.0.1" +schema_version = 1 +authors = ["Jooris Hadeler "] +description = "Syntax highlighting for Extended Backus-Naur Form (EBNF)" + +[grammars.ebnf] +repository = "https://git.hadeler.me/jooris/tree-sitter-ebnf" +commit = "main" + +[lib] +version = "0.1.0" diff --git a/languages/ebnf/brackets.scm b/languages/ebnf/brackets.scm new file mode 100644 index 0000000..a521c6d --- /dev/null +++ b/languages/ebnf/brackets.scm @@ -0,0 +1,15 @@ +; Standard brackets +("[" @open "]" @close) +("{" @open "}" @close) +("(" @open ")" @close) + +; EBNF specific sequence brackets +("(/" @open "/)" @close) +("(:" @open ":)" @close) + +; Strings +("\"" @open "\"" @close) +("'" @open "'" @close) + +; Special sequence +("?" @open "?" @close) diff --git a/languages/ebnf/config.toml b/languages/ebnf/config.toml new file mode 100644 index 0000000..7c7c943 --- /dev/null +++ b/languages/ebnf/config.toml @@ -0,0 +1,15 @@ +name = "EBNF" +grammar = "ebnf" +path_suffixes = ["ebnf"] +brackets = [ + { start = "{", end = "}", close = true, newline = true }, + { start = "[", end = "]", close = true, newline = true }, + { start = "(", end = ")", close = true, newline = false }, + { start = "(/", end = "/)", close = true, newline = false }, + { start = "(:", end = ":)", close = true, newline = false }, + { start = "\"", end = "\"", close = true, newline = false }, + { start = "'", end = "'", close = true, newline = false } +] + +[language_server] +# Leave empty diff --git a/languages/ebnf/highlights.scm b/languages/ebnf/highlights.scm new file mode 100644 index 0000000..78fdb9c --- /dev/null +++ b/languages/ebnf/highlights.scm @@ -0,0 +1,37 @@ +; variables and identifiers +; We match the left-hand side of a rule as a function/type definition for better visual hierarchy +(syntax_rule + (meta_identifier) @type) + +(meta_identifier) @property + +; Literals +(terminal_string) @string +(integer) @number + +; Comments and special sequences +(comment) @comment +(special_sequence) @string.special + +; Operators +"=" @operator +"|" @operator +"-" @operator +"*" @operator + +; Delimiters +"," @punctuation.delimiter +";" @punctuation.delimiter + +; Brackets +"[" @punctuation.bracket +"]" @punctuation.bracket +"{" @punctuation.bracket +"}" @punctuation.bracket +"(" @punctuation.bracket +")" @punctuation.bracket +"(/" @punctuation.bracket +"/)" @punctuation.bracket +"(:" @punctuation.bracket +":)" @punctuation.bracket +"?" @punctuation.bracket diff --git a/languages/ebnf/outline.scm b/languages/ebnf/outline.scm new file mode 100644 index 0000000..39f38e9 --- /dev/null +++ b/languages/ebnf/outline.scm @@ -0,0 +1,3 @@ +(syntax_rule + (meta_identifier) @name +) @item