From 079102759679e8b96b699d4cf893272c271bd04e Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Thu, 1 Mar 2018 10:41:16 -0800 Subject: [PATCH] Add regex syntax inside of expansions --- corpus/expressions.txt | 29 ++++++++++++++++++++++++++--- grammar.js | 9 +++++++-- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/corpus/expressions.txt b/corpus/expressions.txt index 88515f8..6a58fb2 100644 --- a/corpus/expressions.txt +++ b/corpus/expressions.txt @@ -33,6 +33,7 @@ The regex operator [[ "35d8b" =~ ^[0-9a-fA-F] ]] [[ $CMD =~ (^|;)update_terminal_cwd($|;) ]] [[ ! " ${completions[*]} " =~ " $alias_cmd " ]] +! [[ "$a" =~ ^a|b\ *c|d$ ]] --- @@ -46,7 +47,13 @@ The regex operator (bracket_command (word) (string (expansion (subscript (variable_name) (word)))) - (string (simple_expansion (variable_name))))) + (string (simple_expansion (variable_name)))) + (command + (command_name (word)) + (word) + (string (simple_expansion (variable_name))) + (regex) + (word))) ============================= Simple variable expansions @@ -108,7 +115,7 @@ F="${G%% *}" (string (expansion (subscript (variable_name) (word))))) (variable_assignment (variable_name) - (string (expansion (variable_name) (word) (word)))) + (string (expansion (variable_name) (regex) (word) (word)))) (variable_assignment (variable_name) (string (expansion (variable_name) (word) (word))))) @@ -118,7 +125,7 @@ Variable expansions in strings =================================== A="${A:-$B/c}" -A="${b/$c/$d}" +A="${b=$c/$d}" --- @@ -139,6 +146,22 @@ A="${b/$c/$d}" (word) (simple_expansion (variable_name))))))) +=================================== +Variable expansions with regexes +=================================== + +A=${B//:;;/$'\n'} + +# escaped space +C=${D/;\ *;|} + +--- + +(program + (variable_assignment (variable_name) (expansion (variable_name) (regex))) + (comment) + (variable_assignment (variable_name) (expansion (variable_name) (regex)))) + =================================== Other variable expansion operators =================================== diff --git a/grammar.js b/grammar.js index 894529a..e58f360 100644 --- a/grammar.js +++ b/grammar.js @@ -373,9 +373,13 @@ module.exports = grammar({ $._simple_variable_name, $._special_variable_name ), + optional(seq( + token(prec(1, '/')), + alias($.regex_without_right_brace, $.regex) + )), repeat(choice( $._expression, - ':', ':?', '=', ':-', '%', '/', '-', '#' + ':', ':?', '=', ':-', '%', '-', '#' )) ), ), @@ -404,7 +408,8 @@ module.exports = grammar({ seq('\\', noneOf('\\s')) ))), - regex: $ => /\S+/, + regex: $ => /([^\s]|\\.)+/, + regex_without_right_brace: $ => /([^\s}]|\\.)+/, _terminator: $ => choice(';', ';;', '\n', '&') }