Add 2 things:

- Escape sequence
- Seperation before arguments
This commit is contained in:
Uy Ha 2021-04-11 15:04:28 +02:00
parent 788ec10f19
commit 2baec3b814
5 changed files with 962 additions and 692 deletions

View file

@ -33,3 +33,29 @@ message(STATUS Hello)
)
)
)
===========================================
Command invocations with leading seperation
===========================================
message( STATUS)
message(
STATUS)
---
(source_file
(command_invocation
(identifier)
(seperation (space))
(arguments
(argument (unquoted_argument))
)
)
(command_invocation
(identifier)
(seperation (line_ending (newline)))
(arguments
(argument (unquoted_argument))
)
)
)

View file

@ -10,12 +10,27 @@ module.exports = grammar({
newline: $ => /\n/,
identifier: $ => /[A-Za-z_][A-Za-z0-9_]*/,
escape_sequence: $ => choice(
$._escape_identity,
$._escape_encoded,
$._escape_semicolon,
),
_escape_identity: $ => /\\[^A-Za-z0-9;]/,
_escape_encoded: $ => choice('\\t', '\\r', '\\n'),
_escape_semicolon: $ => '\;',
argument: $ => choice(
$.unquoted_argument,
$.bracket_argument,
),
unquoted_argument: $ => repeat1(/[^ ()#\"\\]/),
unquoted_argument: $ => repeat1(
choice(
/[^ ()#\"\\]/,
$.escape_sequence,
)
),
bracket_argument: $ => seq(
$._bracket_open,
@ -36,7 +51,7 @@ module.exports = grammar({
command_invocation: $ => seq(
repeat($.space),
$.identifier,
repeat($.space),
repeat($.seperation),
'(',
repeat($.seperation),
optional($.arguments),

View file

@ -37,6 +37,48 @@
"type": "PATTERN",
"value": "[A-Za-z_][A-Za-z0-9_]*"
},
"escape_sequence": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_escape_identity"
},
{
"type": "SYMBOL",
"name": "_escape_encoded"
},
{
"type": "SYMBOL",
"name": "_escape_semicolon"
}
]
},
"_escape_identity": {
"type": "PATTERN",
"value": "\\\\[^A-Za-z0-9;]"
},
"_escape_encoded": {
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "\\t"
},
{
"type": "STRING",
"value": "\\r"
},
{
"type": "STRING",
"value": "\\n"
}
]
},
"_escape_semicolon": {
"type": "STRING",
"value": ";"
},
"argument": {
"type": "CHOICE",
"members": [
@ -53,8 +95,17 @@
"unquoted_argument": {
"type": "REPEAT1",
"content": {
"type": "PATTERN",
"value": "[^ ()#\\\"\\\\]"
"type": "CHOICE",
"members": [
{
"type": "PATTERN",
"value": "[^ ()#\\\"\\\\]"
},
{
"type": "SYMBOL",
"name": "escape_sequence"
}
]
}
},
"bracket_argument": {
@ -191,7 +242,7 @@
"type": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "space"
"name": "seperation"
}
},
{

View file

@ -69,6 +69,11 @@
]
}
},
{
"type": "escape_sequence",
"named": true,
"fields": {}
},
{
"type": "line_ending",
"named": true,
@ -121,7 +126,17 @@
{
"type": "unquoted_argument",
"named": true,
"fields": {}
"fields": {},
"children": {
"multiple": true,
"required": false,
"types": [
{
"type": "escape_sequence",
"named": true
}
]
}
},
{
"type": "(",
@ -139,6 +154,18 @@
"type": "[",
"named": false
},
{
"type": "\\n",
"named": false
},
{
"type": "\\r",
"named": false
},
{
"type": "\\t",
"named": false
},
{
"type": "]",
"named": false

File diff suppressed because it is too large Load diff