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_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,
|
||||
|
|
|
@ -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": "[^ ()#\\\"\\\\]"
|
||||
|
|
|
@ -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
|
||||
}
|
||||
]
|
2542
src/parser.c
2542
src/parser.c
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue