Add rules for variable ref and related tests

This commit is contained in:
Uy Ha 2021-04-17 21:16:33 +02:00
parent 444e347c9d
commit 84d2b2b3f5
6 changed files with 1883 additions and 929 deletions

View file

@ -64,3 +64,44 @@ with line break")
)
)
)
======================
One variable reference
======================
message("${var}")
---
(source_file
(command_invocation
(identifier)
(arguments
(argument
(quoted_argument
(variable_ref (normal_var))
)
)
)
)
)
=======================
Two Variable references
=======================
message("${var} ${var}")
---
(source_file
(command_invocation
(identifier)
(arguments
(argument
(quoted_argument
(variable_ref (normal_var))
(variable_ref (normal_var))
)
)
)
)
)

View file

@ -84,3 +84,23 @@ STATUS)
)
)
)
====================
Variable referencing
====================
message(${var})
---
(source_file
(command_invocation
(identifier)
(arguments
(argument
(unquoted_argument
(variable_ref (normal_var))
)
)
)
)
)

View file

@ -19,6 +19,20 @@ module.exports = grammar({
_escape_encoded: $ => choice('\\t', '\\r', '\\n'),
_escape_semicolon: $ => '\;',
variable_ref: $ => choice(
$.normal_var,
$.env_var,
$.cache_var,
),
_literal_variable: $ => choice(
/[a-zA-Z0-9/_.+-]/,
$.escape_sequence,
),
normal_var: $ => seq('${', repeat1($._literal_variable), '}'),
env_var: $ => seq('$ENV{', repeat1($._literal_variable), '}'),
cache_var: $ => seq('$CACHE{', repeat1($._literal_variable), '}'),
argument: $ => choice(
$.bracket_argument,
@ -26,7 +40,6 @@ module.exports = grammar({
$.unquoted_argument,
),
bracket_argument: $ => seq(
$._bracket_open,
optional($._bracket_content),
@ -38,6 +51,7 @@ module.exports = grammar({
quoted_argument: $ => seq('"', repeat($._quoted_element), '"'),
_quoted_element: $ => choice(
$.variable_ref,
/[^\\"]/,
$.escape_sequence,
seq('\\', $.newline),
@ -45,18 +59,19 @@ module.exports = grammar({
unquoted_argument: $ => repeat1(
choice(
$.variable_ref,
/[^ ()#\"\\]/,
$.escape_sequence,
)
),
arguments: $ => seq($.argument, repeat($._seperated_arguments)),
_seperated_arguments: $ => prec.left(seq(
repeat1($.seperation),
optional($.argument)
)),
command_invocation: $ => seq(
repeat($.space),
$.identifier,

View file

@ -79,6 +79,96 @@
"type": "STRING",
"value": ";"
},
"variable_ref": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "normal_var"
},
{
"type": "SYMBOL",
"name": "env_var"
},
{
"type": "SYMBOL",
"name": "cache_var"
}
]
},
"_literal_variable": {
"type": "CHOICE",
"members": [
{
"type": "PATTERN",
"value": "[a-zA-Z0-9/_.+-]"
},
{
"type": "SYMBOL",
"name": "escape_sequence"
}
]
},
"normal_var": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "${"
},
{
"type": "REPEAT1",
"content": {
"type": "SYMBOL",
"name": "_literal_variable"
}
},
{
"type": "STRING",
"value": "}"
}
]
},
"env_var": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "$ENV{"
},
{
"type": "REPEAT1",
"content": {
"type": "SYMBOL",
"name": "_literal_variable"
}
},
{
"type": "STRING",
"value": "}"
}
]
},
"cache_var": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "$CACHE{"
},
{
"type": "REPEAT1",
"content": {
"type": "SYMBOL",
"name": "_literal_variable"
}
},
{
"type": "STRING",
"value": "}"
}
]
},
"argument": {
"type": "CHOICE",
"members": [
@ -191,6 +281,10 @@
"_quoted_element": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "variable_ref"
},
{
"type": "PATTERN",
"value": "[^\\\\\"]"
@ -219,6 +313,10 @@
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "variable_ref"
},
{
"type": "PATTERN",
"value": "[^ ()#\\\"\\\\]"

View file

@ -46,6 +46,21 @@
"named": true,
"fields": {}
},
{
"type": "cache_var",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": false,
"types": [
{
"type": "escape_sequence",
"named": true
}
]
}
},
{
"type": "command_invocation",
"named": true,
@ -73,6 +88,21 @@
]
}
},
{
"type": "env_var",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": false,
"types": [
{
"type": "escape_sequence",
"named": true
}
]
}
},
{
"type": "escape_sequence",
"named": true,
@ -93,6 +123,21 @@
]
}
},
{
"type": "normal_var",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": false,
"types": [
{
"type": "escape_sequence",
"named": true
}
]
}
},
{
"type": "quoted_argument",
"named": true,
@ -108,6 +153,10 @@
{
"type": "newline",
"named": true
},
{
"type": "variable_ref",
"named": true
}
]
}
@ -157,6 +206,33 @@
{
"type": "escape_sequence",
"named": true
},
{
"type": "variable_ref",
"named": true
}
]
}
},
{
"type": "variable_ref",
"named": true,
"fields": {},
"children": {
"multiple": false,
"required": true,
"types": [
{
"type": "cache_var",
"named": true
},
{
"type": "env_var",
"named": true
},
{
"type": "normal_var",
"named": true
}
]
}
@ -165,6 +241,18 @@
"type": "\"",
"named": false
},
{
"type": "$CACHE{",
"named": false
},
{
"type": "$ENV{",
"named": false
},
{
"type": "${",
"named": false
},
{
"type": "(",
"named": false
@ -212,5 +300,9 @@
{
"type": "space",
"named": true
},
{
"type": "}",
"named": false
}
]

File diff suppressed because it is too large Load diff