Two things:
- Start using prettier for formatting - Start adding foreach loop highlighting
This commit is contained in:
parent
4a81a1d859
commit
045e372f3b
1
.prettierrc.toml
Normal file
1
.prettierrc.toml
Normal file
|
@ -0,0 +1 @@
|
||||||
|
printWidth = 120
|
121
grammar.js
121
grammar.js
|
@ -1,84 +1,65 @@
|
||||||
module.exports = grammar({
|
module.exports = grammar({
|
||||||
name: 'cmake',
|
name: "cmake",
|
||||||
|
|
||||||
rules: {
|
rules: {
|
||||||
source_file: $ => repeat($.command_invocation),
|
source_file: ($) => repeat($.command_invocation),
|
||||||
|
|
||||||
line_ending: $ => $.newline,
|
line_ending: ($) => $.newline,
|
||||||
seperation: $ => choice($.space, $.line_ending),
|
seperation: ($) => choice($.space, $.line_ending),
|
||||||
space: $ => /[ \t]+/,
|
space: ($) => /[ \t]+/,
|
||||||
newline: $ => /\n/,
|
newline: ($) => /\n/,
|
||||||
identifier: $ => /[A-Za-z_][A-Za-z0-9_]*/,
|
identifier: ($) => /[A-Za-z_][A-Za-z0-9_]*/,
|
||||||
|
|
||||||
escape_sequence: $ => choice(
|
escape_sequence: ($) => choice($._escape_identity, $._escape_encoded, $._escape_semicolon),
|
||||||
$._escape_identity,
|
_escape_identity: ($) => /\\[^A-Za-z0-9;]/,
|
||||||
$._escape_encoded,
|
_escape_encoded: ($) => choice("\\t", "\\r", "\\n"),
|
||||||
$._escape_semicolon,
|
_escape_semicolon: ($) => ";",
|
||||||
),
|
|
||||||
_escape_identity: $ => /\\[^A-Za-z0-9;]/,
|
|
||||||
_escape_encoded: $ => choice('\\t', '\\r', '\\n'),
|
|
||||||
_escape_semicolon: $ => '\;',
|
|
||||||
|
|
||||||
variable_ref: $ => choice(
|
variable: ($) => repeat1(choice(/[a-zA-Z0-9/_.+-]/, $.escape_sequence)),
|
||||||
$.normal_var,
|
variable_ref: ($) => choice($.normal_var, $.env_var, $.cache_var),
|
||||||
$.env_var,
|
normal_var: ($) => seq("${", $.variable, "}"),
|
||||||
$.cache_var,
|
env_var: ($) => seq("$ENV{", $.variable, "}"),
|
||||||
),
|
cache_var: ($) => seq("$CACHE{", $.variable, "}"),
|
||||||
variable: $ => repeat1(choice(
|
|
||||||
/[a-zA-Z0-9/_.+-]/,
|
|
||||||
$.escape_sequence,
|
|
||||||
)),
|
|
||||||
normal_var: $ => seq('${', $.variable, '}'),
|
|
||||||
env_var: $ => seq('$ENV{', $.variable, '}'),
|
|
||||||
cache_var: $ => seq('$CACHE{', $.variable, '}'),
|
|
||||||
|
|
||||||
argument: $ => choice(
|
argument: ($) => choice($.bracket_argument, $.quoted_argument, $.unquoted_argument),
|
||||||
$.bracket_argument,
|
|
||||||
$.quoted_argument,
|
|
||||||
$.unquoted_argument,
|
|
||||||
),
|
|
||||||
|
|
||||||
bracket_argument: $ => seq(
|
bracket_argument: ($) => seq($._bracket_open, optional($.bracket_content), $._bracket_close),
|
||||||
$._bracket_open,
|
_bracket_open: ($) => seq("[", repeat("="), "["),
|
||||||
optional($.bracket_content),
|
bracket_content: ($) => repeat1(/[^\]]/),
|
||||||
$._bracket_close,
|
_bracket_close: ($) => seq("]", repeat("="), "]"),
|
||||||
),
|
|
||||||
_bracket_open: $ => seq('[', repeat('='), '['),
|
|
||||||
bracket_content: $ => repeat1(/[^\]]/),
|
|
||||||
_bracket_close: $ => seq(']', repeat('='), ']'),
|
|
||||||
|
|
||||||
quoted_argument: $ => seq('"', optional($.quoted_element), '"'),
|
quoted_argument: ($) => seq('"', optional($.quoted_element), '"'),
|
||||||
quoted_element: $ => repeat1(choice(
|
quoted_element: ($) => repeat1(choice($.variable_ref, /[^\\"]/, $.escape_sequence, seq("\\", $.newline))),
|
||||||
$.variable_ref,
|
|
||||||
/[^\\"]/,
|
|
||||||
$.escape_sequence,
|
|
||||||
seq('\\', $.newline),
|
|
||||||
)),
|
|
||||||
|
|
||||||
unquoted_argument: $ => repeat1(
|
unquoted_argument: ($) => repeat1(choice($.variable_ref, /[^ ()#\"\\]/, $.escape_sequence)),
|
||||||
choice(
|
|
||||||
$.variable_ref,
|
|
||||||
/[^ ()#\"\\]/,
|
|
||||||
$.escape_sequence,
|
|
||||||
)
|
|
||||||
),
|
|
||||||
|
|
||||||
arguments: $ => seq($.argument, repeat($._seperated_arguments)),
|
arguments: ($) => seq($.argument, repeat($._seperated_arguments)),
|
||||||
_seperated_arguments: $ => prec.left(seq(
|
_seperated_arguments: ($) => prec.left(seq(repeat1($.seperation), optional($.argument))),
|
||||||
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(
|
normal_command: ($) =>
|
||||||
repeat($.space),
|
seq(repeat($.space), $.identifier, repeat($.space), "(", repeat($.seperation), optional($.arguments), ")"),
|
||||||
$.identifier,
|
|
||||||
repeat($.seperation),
|
|
||||||
'(',
|
|
||||||
repeat($.seperation),
|
|
||||||
optional($.arguments),
|
|
||||||
')'
|
|
||||||
),
|
|
||||||
|
|
||||||
}
|
command_invocation: ($) => choice($.normal_command, $.foreach_loop),
|
||||||
})
|
},
|
||||||
|
});
|
||||||
|
|
178
src/grammar.json
178
src/grammar.json
|
@ -79,6 +79,22 @@
|
||||||
"type": "STRING",
|
"type": "STRING",
|
||||||
"value": ";"
|
"value": ";"
|
||||||
},
|
},
|
||||||
|
"variable": {
|
||||||
|
"type": "REPEAT1",
|
||||||
|
"content": {
|
||||||
|
"type": "CHOICE",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "PATTERN",
|
||||||
|
"value": "[a-zA-Z0-9/_.+-]"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "escape_sequence"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
"variable_ref": {
|
"variable_ref": {
|
||||||
"type": "CHOICE",
|
"type": "CHOICE",
|
||||||
"members": [
|
"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": {
|
"normal_var": {
|
||||||
"type": "SEQ",
|
"type": "SEQ",
|
||||||
"members": [
|
"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",
|
"type": "SEQ",
|
||||||
"members": [
|
"members": [
|
||||||
{
|
{
|
||||||
|
@ -392,7 +521,7 @@
|
||||||
"type": "REPEAT",
|
"type": "REPEAT",
|
||||||
"content": {
|
"content": {
|
||||||
"type": "SYMBOL",
|
"type": "SYMBOL",
|
||||||
"name": "seperation"
|
"name": "space"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -423,6 +552,19 @@
|
||||||
"value": ")"
|
"value": ")"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
"command_invocation": {
|
||||||
|
"type": "CHOICE",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "normal_command"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "foreach_loop"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"extras": [
|
"extras": [
|
||||||
|
|
|
@ -81,23 +81,15 @@
|
||||||
"named": true,
|
"named": true,
|
||||||
"fields": {},
|
"fields": {},
|
||||||
"children": {
|
"children": {
|
||||||
"multiple": true,
|
"multiple": false,
|
||||||
"required": true,
|
"required": true,
|
||||||
"types": [
|
"types": [
|
||||||
{
|
{
|
||||||
"type": "arguments",
|
"type": "foreach_loop",
|
||||||
"named": true
|
"named": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "identifier",
|
"type": "normal_command",
|
||||||
"named": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "seperation",
|
|
||||||
"named": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "space",
|
|
||||||
"named": true
|
"named": true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -123,6 +115,60 @@
|
||||||
"named": true,
|
"named": true,
|
||||||
"fields": {}
|
"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",
|
"type": "line_ending",
|
||||||
"named": true,
|
"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",
|
"type": "normal_var",
|
||||||
"named": true,
|
"named": true,
|
||||||
|
@ -334,10 +407,34 @@
|
||||||
"type": "]",
|
"type": "]",
|
||||||
"named": false
|
"named": false
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "a",
|
||||||
|
"named": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "b",
|
||||||
|
"named": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "c",
|
||||||
|
"named": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "endforeach",
|
||||||
|
"named": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "foreach",
|
||||||
|
"named": false
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "identifier",
|
"type": "identifier",
|
||||||
"named": true
|
"named": true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "items",
|
||||||
|
"named": false
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "newline",
|
"type": "newline",
|
||||||
"named": true
|
"named": true
|
||||||
|
|
5019
src/parser.c
5019
src/parser.c
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue