2021-04-06 16:55:44 -04:00
|
|
|
module.exports = grammar({
|
2021-06-03 18:19:26 -04:00
|
|
|
name: "cmake",
|
2021-04-06 16:55:44 -04:00
|
|
|
|
|
|
|
rules: {
|
2021-06-03 18:19:26 -04:00
|
|
|
source_file: ($) => repeat($.command_invocation),
|
2021-04-06 17:38:23 -04:00
|
|
|
|
2021-06-03 18:19:26 -04:00
|
|
|
line_ending: ($) => $.newline,
|
|
|
|
seperation: ($) => choice($.space, $.line_ending),
|
|
|
|
space: ($) => /[ \t]+/,
|
|
|
|
newline: ($) => /\n/,
|
|
|
|
identifier: ($) => /[A-Za-z_][A-Za-z0-9_]*/,
|
2021-04-10 12:03:07 -04:00
|
|
|
|
2021-06-03 18:19:26 -04:00
|
|
|
escape_sequence: ($) => choice($._escape_identity, $._escape_encoded, $._escape_semicolon),
|
|
|
|
_escape_identity: ($) => /\\[^A-Za-z0-9;]/,
|
|
|
|
_escape_encoded: ($) => choice("\\t", "\\r", "\\n"),
|
|
|
|
_escape_semicolon: ($) => ";",
|
2021-04-11 09:04:28 -04:00
|
|
|
|
2021-06-03 18:19:26 -04:00
|
|
|
variable: ($) => 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, "}"),
|
2021-04-17 15:16:33 -04:00
|
|
|
|
2021-06-03 18:19:26 -04:00
|
|
|
argument: ($) => choice($.bracket_argument, $.quoted_argument, $.unquoted_argument),
|
2021-04-10 15:55:47 -04:00
|
|
|
|
2021-06-03 18:19:26 -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
|
|
|
|
2021-06-03 18:19:26 -04:00
|
|
|
quoted_argument: ($) => seq('"', optional($.quoted_element), '"'),
|
|
|
|
quoted_element: ($) => repeat1(choice($.variable_ref, /[^\\"]/, $.escape_sequence, seq("\\", $.newline))),
|
2021-04-11 11:27:20 -04:00
|
|
|
|
2021-06-03 18:19:26 -04:00
|
|
|
unquoted_argument: ($) => repeat1(choice($.variable_ref, /[^ ()#\"\\]/, $.escape_sequence)),
|
2021-04-11 09:48:26 -04:00
|
|
|
|
2021-06-03 18:19:26 -04:00
|
|
|
arguments: ($) => seq($.argument, repeat($._seperated_arguments)),
|
|
|
|
_seperated_arguments: ($) => prec.left(seq(repeat1($.seperation), optional($.argument))),
|
2021-04-06 17:38:23 -04:00
|
|
|
|
2021-06-03 18:19:26 -04:00
|
|
|
foreach_loop: ($) =>
|
|
|
|
seq(
|
|
|
|
repeat($.space),
|
|
|
|
"foreach",
|
|
|
|
repeat($.seperation),
|
|
|
|
"(",
|
|
|
|
choice($.foreach_range, $.foreach_lists_items, $.foreach_zip_lists),
|
|
|
|
")",
|
|
|
|
repeat($.command_invocation),
|
|
|
|
repeat($.space),
|
|
|
|
"endforeach",
|
|
|
|
repeat($.seperation),
|
|
|
|
"(",
|
|
|
|
optional($.variable),
|
|
|
|
")"
|
|
|
|
),
|
|
|
|
foreach_items: ($) => seq("items"),
|
|
|
|
foreach_range: ($) => seq("a"),
|
|
|
|
foreach_lists_items: ($) => seq("b"),
|
|
|
|
foreach_zip_lists: ($) => seq("c"),
|
2021-04-17 15:16:33 -04:00
|
|
|
|
2021-06-03 18:19:26 -04:00
|
|
|
normal_command: ($) =>
|
|
|
|
seq(repeat($.space), $.identifier, repeat($.space), "(", repeat($.seperation), optional($.arguments), ")"),
|
2021-04-07 18:17:56 -04:00
|
|
|
|
2021-06-03 18:19:26 -04:00
|
|
|
command_invocation: ($) => choice($.normal_command, $.foreach_loop),
|
|
|
|
},
|
|
|
|
});
|