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_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,

View file

@ -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": "[^ ()#\\\"\\\\]"

View file

@ -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
} }
] ]

File diff suppressed because it is too large Load diff