Support ANSII-C quoting in strings prefixed with $

See 
https://www.gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html 
for details
This commit is contained in:
Nathan Sobo 2019-07-26 11:29:35 -06:00
parent 3b15f16973
commit 1c48cd1676
6 changed files with 68696 additions and 68659 deletions

View File

@ -299,6 +299,16 @@ echo "s$"
(command (command_name (word)) (string)) (command (command_name (word)) (string))
(command (command_name (word)) (string))) (command (command_name (word)) (string)))
========================================
Strings with ANSI-C quoting
========================================
echo $'Here\'s johnny!\r\n'
---
(program (command (command_name (word)) (ansii_c_string)))
========================================= =========================================
Arrays and array expansions Arrays and array expansions
========================================= =========================================

View File

@ -396,6 +396,7 @@ module.exports = grammar({
$.word, $.word,
$.string, $.string,
$.raw_string, $.raw_string,
$.ansii_c_string,
$.expansion, $.expansion,
$.simple_expansion, $.simple_expansion,
$.string_expansion, $.string_expansion,
@ -445,6 +446,8 @@ module.exports = grammar({
raw_string: $ => /'[^']*'/, raw_string: $ => /'[^']*'/,
ansii_c_string: $ => /\$'([^']|\\')*'/,
simple_expansion: $ => seq( simple_expansion: $ => seq(
'$', '$',
choice( choice(

8
src/grammar.json vendored
View File

@ -1626,6 +1626,10 @@
"type": "SYMBOL", "type": "SYMBOL",
"name": "raw_string" "name": "raw_string"
}, },
{
"type": "SYMBOL",
"name": "ansii_c_string"
},
{ {
"type": "SYMBOL", "type": "SYMBOL",
"name": "expansion" "name": "expansion"
@ -1866,6 +1870,10 @@
"type": "PATTERN", "type": "PATTERN",
"value": "'[^']*'" "value": "'[^']*'"
}, },
"ansii_c_string": {
"type": "PATTERN",
"value": "\\$'([^']|\\\\')*'"
},
"simple_expansion": { "simple_expansion": {
"type": "SEQ", "type": "SEQ",
"members": [ "members": [

1818
src/node-types.json vendored

File diff suppressed because it is too large Load Diff

135492
src/parser.c vendored

File diff suppressed because it is too large Load Diff

View File

@ -122,22 +122,26 @@ struct TSLanguage {
#define START_LEXER() \ #define START_LEXER() \
bool result = false; \ bool result = false; \
bool skip = false; \
int32_t lookahead; \ int32_t lookahead; \
goto start; \
next_state: \ next_state: \
lexer->advance(lexer, skip); \
start: \
skip = false; \
lookahead = lexer->lookahead; lookahead = lexer->lookahead;
#define ADVANCE(state_value) \ #define ADVANCE(state_value) \
{ \ { \
lexer->advance(lexer, false); \ state = state_value; \
state = state_value; \ goto next_state; \
goto next_state; \
} }
#define SKIP(state_value) \ #define SKIP(state_value) \
{ \ { \
lexer->advance(lexer, true); \ skip = true; \
state = state_value; \ state = state_value; \
goto next_state; \ goto next_state; \
} }
#define ACCEPT_TOKEN(symbol_value) \ #define ACCEPT_TOKEN(symbol_value) \