Add rules for variable ref and related tests
This commit is contained in:
parent
444e347c9d
commit
84d2b2b3f5
|
@ -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))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
|
@ -84,3 +84,23 @@ STATUS)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
====================
|
||||||
|
Variable referencing
|
||||||
|
====================
|
||||||
|
message(${var})
|
||||||
|
---
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(command_invocation
|
||||||
|
(identifier)
|
||||||
|
(arguments
|
||||||
|
(argument
|
||||||
|
(unquoted_argument
|
||||||
|
(variable_ref (normal_var))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
19
grammar.js
19
grammar.js
|
@ -19,6 +19,20 @@ module.exports = grammar({
|
||||||
_escape_encoded: $ => choice('\\t', '\\r', '\\n'),
|
_escape_encoded: $ => choice('\\t', '\\r', '\\n'),
|
||||||
_escape_semicolon: $ => '\;',
|
_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(
|
argument: $ => choice(
|
||||||
$.bracket_argument,
|
$.bracket_argument,
|
||||||
|
@ -26,7 +40,6 @@ module.exports = grammar({
|
||||||
$.unquoted_argument,
|
$.unquoted_argument,
|
||||||
),
|
),
|
||||||
|
|
||||||
|
|
||||||
bracket_argument: $ => seq(
|
bracket_argument: $ => seq(
|
||||||
$._bracket_open,
|
$._bracket_open,
|
||||||
optional($._bracket_content),
|
optional($._bracket_content),
|
||||||
|
@ -38,6 +51,7 @@ module.exports = grammar({
|
||||||
|
|
||||||
quoted_argument: $ => seq('"', repeat($._quoted_element), '"'),
|
quoted_argument: $ => seq('"', repeat($._quoted_element), '"'),
|
||||||
_quoted_element: $ => choice(
|
_quoted_element: $ => choice(
|
||||||
|
$.variable_ref,
|
||||||
/[^\\"]/,
|
/[^\\"]/,
|
||||||
$.escape_sequence,
|
$.escape_sequence,
|
||||||
seq('\\', $.newline),
|
seq('\\', $.newline),
|
||||||
|
@ -45,18 +59,19 @@ module.exports = grammar({
|
||||||
|
|
||||||
unquoted_argument: $ => repeat1(
|
unquoted_argument: $ => repeat1(
|
||||||
choice(
|
choice(
|
||||||
|
$.variable_ref,
|
||||||
/[^ ()#\"\\]/,
|
/[^ ()#\"\\]/,
|
||||||
$.escape_sequence,
|
$.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),
|
repeat1($.seperation),
|
||||||
optional($.argument)
|
optional($.argument)
|
||||||
)),
|
)),
|
||||||
|
|
||||||
|
|
||||||
command_invocation: $ => seq(
|
command_invocation: $ => seq(
|
||||||
repeat($.space),
|
repeat($.space),
|
||||||
$.identifier,
|
$.identifier,
|
||||||
|
|
|
@ -79,6 +79,96 @@
|
||||||
"type": "STRING",
|
"type": "STRING",
|
||||||
"value": ";"
|
"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": {
|
"argument": {
|
||||||
"type": "CHOICE",
|
"type": "CHOICE",
|
||||||
"members": [
|
"members": [
|
||||||
|
@ -191,6 +281,10 @@
|
||||||
"_quoted_element": {
|
"_quoted_element": {
|
||||||
"type": "CHOICE",
|
"type": "CHOICE",
|
||||||
"members": [
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "variable_ref"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "PATTERN",
|
"type": "PATTERN",
|
||||||
"value": "[^\\\\\"]"
|
"value": "[^\\\\\"]"
|
||||||
|
@ -219,6 +313,10 @@
|
||||||
"content": {
|
"content": {
|
||||||
"type": "CHOICE",
|
"type": "CHOICE",
|
||||||
"members": [
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "variable_ref"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "PATTERN",
|
"type": "PATTERN",
|
||||||
"value": "[^ ()#\\\"\\\\]"
|
"value": "[^ ()#\\\"\\\\]"
|
||||||
|
|
|
@ -46,6 +46,21 @@
|
||||||
"named": true,
|
"named": true,
|
||||||
"fields": {}
|
"fields": {}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "cache_var",
|
||||||
|
"named": true,
|
||||||
|
"fields": {},
|
||||||
|
"children": {
|
||||||
|
"multiple": true,
|
||||||
|
"required": false,
|
||||||
|
"types": [
|
||||||
|
{
|
||||||
|
"type": "escape_sequence",
|
||||||
|
"named": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "command_invocation",
|
"type": "command_invocation",
|
||||||
"named": true,
|
"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",
|
"type": "escape_sequence",
|
||||||
"named": true,
|
"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",
|
"type": "quoted_argument",
|
||||||
"named": true,
|
"named": true,
|
||||||
|
@ -108,6 +153,10 @@
|
||||||
{
|
{
|
||||||
"type": "newline",
|
"type": "newline",
|
||||||
"named": true
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "variable_ref",
|
||||||
|
"named": true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -157,6 +206,33 @@
|
||||||
{
|
{
|
||||||
"type": "escape_sequence",
|
"type": "escape_sequence",
|
||||||
"named": true
|
"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": "\"",
|
"type": "\"",
|
||||||
"named": false
|
"named": false
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "$CACHE{",
|
||||||
|
"named": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "$ENV{",
|
||||||
|
"named": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "${",
|
||||||
|
"named": false
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "(",
|
"type": "(",
|
||||||
"named": false
|
"named": false
|
||||||
|
@ -212,5 +300,9 @@
|
||||||
{
|
{
|
||||||
"type": "space",
|
"type": "space",
|
||||||
"named": true
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "}",
|
||||||
|
"named": false
|
||||||
}
|
}
|
||||||
]
|
]
|
2542
src/parser.c
2542
src/parser.c
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue