Two things:

- Start using prettier for formatting
- Start adding foreach loop highlighting
This commit is contained in:
Uy Ha 2021-06-04 00:19:26 +02:00
parent 4a81a1d859
commit 045e372f3b
5 changed files with 3954 additions and 1484 deletions

1
.prettierrc.toml Normal file
View file

@ -0,0 +1 @@
printWidth = 120

View file

@ -1,84 +1,65 @@
module.exports = grammar({
name: 'cmake',
name: "cmake",
rules: {
source_file: $ => repeat($.command_invocation),
source_file: ($) => repeat($.command_invocation),
line_ending: $ => $.newline,
seperation: $ => choice($.space, $.line_ending),
space: $ => /[ \t]+/,
newline: $ => /\n/,
identifier: $ => /[A-Za-z_][A-Za-z0-9_]*/,
line_ending: ($) => $.newline,
seperation: ($) => choice($.space, $.line_ending),
space: ($) => /[ \t]+/,
newline: ($) => /\n/,
identifier: ($) => /[A-Za-z_][A-Za-z0-9_]*/,
escape_sequence: $ => choice(
$._escape_identity,
$._escape_encoded,
$._escape_semicolon,
),
_escape_identity: $ => /\\[^A-Za-z0-9;]/,
_escape_encoded: $ => choice('\\t', '\\r', '\\n'),
_escape_semicolon: $ => '\;',
escape_sequence: ($) => choice($._escape_identity, $._escape_encoded, $._escape_semicolon),
_escape_identity: ($) => /\\[^A-Za-z0-9;]/,
_escape_encoded: ($) => choice("\\t", "\\r", "\\n"),
_escape_semicolon: ($) => ";",
variable_ref: $ => choice(
$.normal_var,
$.env_var,
$.cache_var,
),
variable: $ => repeat1(choice(
/[a-zA-Z0-9/_.+-]/,
$.escape_sequence,
)),
normal_var: $ => seq('${', $.variable, '}'),
env_var: $ => seq('$ENV{', $.variable, '}'),
cache_var: $ => seq('$CACHE{', $.variable, '}'),
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, "}"),
argument: $ => choice(
$.bracket_argument,
$.quoted_argument,
$.unquoted_argument,
),
argument: ($) => choice($.bracket_argument, $.quoted_argument, $.unquoted_argument),
bracket_argument: $ => seq(
$._bracket_open,
optional($.bracket_content),
$._bracket_close,
),
_bracket_open: $ => seq('[', repeat('='), '['),
bracket_content: $ => repeat1(/[^\]]/),
_bracket_close: $ => seq(']', repeat('='), ']'),
bracket_argument: ($) => seq($._bracket_open, optional($.bracket_content), $._bracket_close),
_bracket_open: ($) => seq("[", repeat("="), "["),
bracket_content: ($) => repeat1(/[^\]]/),
_bracket_close: ($) => seq("]", repeat("="), "]"),
quoted_argument: $ => seq('"', optional($.quoted_element), '"'),
quoted_element: $ => repeat1(choice(
$.variable_ref,
/[^\\"]/,
$.escape_sequence,
seq('\\', $.newline),
)),
quoted_argument: ($) => seq('"', optional($.quoted_element), '"'),
quoted_element: ($) => repeat1(choice($.variable_ref, /[^\\"]/, $.escape_sequence, seq("\\", $.newline))),
unquoted_argument: $ => repeat1(
choice(
$.variable_ref,
/[^ ()#\"\\]/,
$.escape_sequence,
)
),
unquoted_argument: ($) => repeat1(choice($.variable_ref, /[^ ()#\"\\]/, $.escape_sequence)),
arguments: $ => seq($.argument, repeat($._seperated_arguments)),
_seperated_arguments: $ => prec.left(seq(
repeat1($.seperation),
optional($.argument)
)),
arguments: ($) => seq($.argument, repeat($._seperated_arguments)),
_seperated_arguments: ($) => prec.left(seq(repeat1($.seperation), optional($.argument))),
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"),
command_invocation: $ => seq(
repeat($.space),
$.identifier,
repeat($.seperation),
'(',
repeat($.seperation),
optional($.arguments),
')'
),
normal_command: ($) =>
seq(repeat($.space), $.identifier, repeat($.space), "(", repeat($.seperation), optional($.arguments), ")"),
}
})
command_invocation: ($) => choice($.normal_command, $.foreach_loop),
},
});

View file

@ -79,6 +79,22 @@
"type": "STRING",
"value": ";"
},
"variable": {
"type": "REPEAT1",
"content": {
"type": "CHOICE",
"members": [
{
"type": "PATTERN",
"value": "[a-zA-Z0-9/_.+-]"
},
{
"type": "SYMBOL",
"name": "escape_sequence"
}
]
}
},
"variable_ref": {
"type": "CHOICE",
"members": [
@ -96,22 +112,6 @@
}
]
},
"variable": {
"type": "REPEAT1",
"content": {
"type": "CHOICE",
"members": [
{
"type": "PATTERN",
"value": "[a-zA-Z0-9/_.+-]"
},
{
"type": "SYMBOL",
"name": "escape_sequence"
}
]
}
},
"normal_var": {
"type": "SEQ",
"members": [
@ -374,7 +374,136 @@
]
}
},
"command_invocation": {
"foreach_loop": {
"type": "SEQ",
"members": [
{
"type": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "space"
}
},
{
"type": "STRING",
"value": "foreach"
},
{
"type": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "seperation"
}
},
{
"type": "STRING",
"value": "("
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "foreach_range"
},
{
"type": "SYMBOL",
"name": "foreach_lists_items"
},
{
"type": "SYMBOL",
"name": "foreach_zip_lists"
}
]
},
{
"type": "STRING",
"value": ")"
},
{
"type": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "command_invocation"
}
},
{
"type": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "space"
}
},
{
"type": "STRING",
"value": "endforeach"
},
{
"type": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "seperation"
}
},
{
"type": "STRING",
"value": "("
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "variable"
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": ")"
}
]
},
"foreach_items": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "items"
}
]
},
"foreach_range": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "a"
}
]
},
"foreach_lists_items": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "b"
}
]
},
"foreach_zip_lists": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "c"
}
]
},
"normal_command": {
"type": "SEQ",
"members": [
{
@ -392,7 +521,7 @@
"type": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "seperation"
"name": "space"
}
},
{
@ -423,6 +552,19 @@
"value": ")"
}
]
},
"command_invocation": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "normal_command"
},
{
"type": "SYMBOL",
"name": "foreach_loop"
}
]
}
},
"extras": [

View file

@ -81,23 +81,15 @@
"named": true,
"fields": {},
"children": {
"multiple": true,
"multiple": false,
"required": true,
"types": [
{
"type": "arguments",
"type": "foreach_loop",
"named": true
},
{
"type": "identifier",
"named": true
},
{
"type": "seperation",
"named": true
},
{
"type": "space",
"type": "normal_command",
"named": true
}
]
@ -123,6 +115,60 @@
"named": true,
"fields": {}
},
{
"type": "foreach_lists_items",
"named": true,
"fields": {}
},
{
"type": "foreach_loop",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "command_invocation",
"named": true
},
{
"type": "foreach_lists_items",
"named": true
},
{
"type": "foreach_range",
"named": true
},
{
"type": "foreach_zip_lists",
"named": true
},
{
"type": "seperation",
"named": true
},
{
"type": "space",
"named": true
},
{
"type": "variable",
"named": true
}
]
}
},
{
"type": "foreach_range",
"named": true,
"fields": {}
},
{
"type": "foreach_zip_lists",
"named": true,
"fields": {}
},
{
"type": "line_ending",
"named": true,
@ -138,6 +184,33 @@
]
}
},
{
"type": "normal_command",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "arguments",
"named": true
},
{
"type": "identifier",
"named": true
},
{
"type": "seperation",
"named": true
},
{
"type": "space",
"named": true
}
]
}
},
{
"type": "normal_var",
"named": true,
@ -334,10 +407,34 @@
"type": "]",
"named": false
},
{
"type": "a",
"named": false
},
{
"type": "b",
"named": false
},
{
"type": "c",
"named": false
},
{
"type": "endforeach",
"named": false
},
{
"type": "foreach",
"named": false
},
{
"type": "identifier",
"named": true
},
{
"type": "items",
"named": false
},
{
"type": "newline",
"named": true

File diff suppressed because it is too large Load diff