Files
tree-sitter-noil/grammar.js
2025-07-25 23:28:58 +02:00

69 lines
1.4 KiB
JavaScript

/// <reference types="tree-sitter-cli/dsl" />
// @ts-check
module.exports = grammar({
name: "noil",
extras: $ => [
/[ \t]+/, // skip whitespace but not newlines
],
rules: {
source_file: $ => repeat($.line),
line: $ => choice(
$.operation_line,
$.operation_only_line,
$.mapping_line,
$.path_only_line,
$.empty_line
),
empty_line: _ => "\n",
path_only_line: $ => seq(
":",
field("path", $.file_path),
"\n"
),
mapping_line: $ => seq(
field("prefix", $.prefix),
":",
field("path", $.file_path),
"\n"
),
operation_line: $ => seq(
field("operation", $.operation),
field("prefix", $.prefix),
":",
field("path", $.file_path),
"\n"
),
operation_only_line: $ => seq(
field("operation", $.operation),
":",
field("path", $.file_path),
"\n"
),
prefix: _ => /[a-z0-9]+/, // allow lowercase alphanumeric
file_path: _ => /[^ \t\n][^\n]*/, // must not start with space or newline
operation: $ => choice(
$.op_add,
$.op_delete,
$.op_move,
$.op_copy,
$.generic_operation
),
op_add: _ => choice("A", "ADD"),
op_delete: _ => choice("D", "DELETE"),
op_move: _ => choice("M", "MV", "MOVE", "RENAME"),
op_copy: _ => choice("C","COPY"),
generic_operation: _ => /[A-Z]+/,
}
});