tree-sitter-cmake/grammar.js

67 lines
2.5 KiB
JavaScript
Raw Normal View History

2021-04-06 16:55:44 -04:00
module.exports = grammar({
name: "cmake",
2021-04-06 16:55:44 -04:00
rules: {
2021-06-07 18:02:13 -04:00
source_file: ($) => repeat($._command_invocation),
2021-04-06 17:38:23 -04:00
2021-06-14 15:33:30 -04:00
_line_ending: ($) => $._newline,
_seperation: ($) => choice($._space, $._line_ending),
_space: ($) => /[ \t]+/,
_newline: ($) => /\n+/,
2021-06-07 17:02:35 -04:00
...commands("foreach", "endforeach"),
identifier: ($) => /[A-Za-z_][A-Za-z0-9_]*/,
integer: ($) => /[+-]*\d+/,
escape_sequence: ($) => choice($._escape_identity, $._escape_encoded, $._escape_semicolon),
_escape_identity: ($) => /\\[^A-Za-z0-9;]/,
_escape_encoded: ($) => choice("\\t", "\\r", "\\n"),
_escape_semicolon: ($) => ";",
variable: ($) => prec.left(repeat1(choice(/[a-zA-Z0-9/_.+-]/, $.escape_sequence))),
variable_ref: ($) => choice($.normal_var, $.env_var, $.cache_var),
normal_var: ($) => seq("${", $.variable, "}"),
env_var: ($) => seq("$ENV{", $.variable, "}"),
cache_var: ($) => seq("$CACHE{", $.variable, "}"),
argument: ($) => choice($.bracket_argument, $.quoted_argument, $.unquoted_argument),
2021-04-10 15:55:47 -04:00
bracket_argument: ($) => seq($._bracket_open, optional($.bracket_content), $._bracket_close),
_bracket_open: ($) => seq("[", repeat("="), "["),
bracket_content: ($) => repeat1(/[^\]]/),
_bracket_close: ($) => seq("]", repeat("="), "]"),
2021-04-10 15:55:47 -04:00
quoted_argument: ($) => seq('"', optional($.quoted_element), '"'),
quoted_element: ($) =>
2021-06-14 15:33:30 -04:00
repeat1(choice($.variable_ref, /[^\\"]/, $.escape_sequence, seq("\\", $._newline))),
2021-04-11 11:27:20 -04:00
unquoted_argument: ($) => repeat1(choice($.variable_ref, /[^ ()#\"\\]/, $.escape_sequence)),
2021-04-11 09:48:26 -04:00
arguments: ($) => seq($.argument, repeat($._seperated_arguments)),
2021-06-14 15:33:30 -04:00
_seperated_arguments: ($) => prec.left(seq(repeat1($._seperation), optional($.argument))),
2021-04-06 17:38:23 -04:00
foreach_command: ($) => seq($.foreach, "(", $.arguments, ")"),
2021-06-07 17:02:35 -04:00
endforeach_command: ($) =>
2021-06-14 15:33:30 -04:00
seq($.endforeach, "(", repeat($._seperation), optional($.argument), ")"),
2021-06-07 18:07:49 -04:00
foreach_loop: ($) =>
seq($.foreach_command, repeat($._command_invocation), $.endforeach_command),
2021-06-14 15:33:30 -04:00
normal_command: ($) =>
seq($.identifier, "(", repeat($._seperation), optional($.arguments), ")"),
2021-06-07 18:07:49 -04:00
_command_invocation: ($) => choice($.normal_command, $.foreach_loop),
},
});
2021-06-07 17:02:35 -04:00
function iregex(s) {
return new RegExp(
Array.from(s).reduce((acc, value) => acc + `[${value.toLowerCase()}${value.toUpperCase()}]`, "")
);
}
function commandName(name) {
return { [name]: ($) => iregex(name) };
2021-06-07 17:02:35 -04:00
}
function commands(...names) {
return Object.assign({}, ...names.map(commandName));
}