From 2a5b01b885422664dc03debbc9db71969c31a74a Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Wed, 28 Feb 2018 16:28:55 -0800 Subject: [PATCH] Generalize parsing of expansion operators --- corpus/expressions.txt | 21 +++++++++++++++++++++ grammar.js | 12 ++++-------- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/corpus/expressions.txt b/corpus/expressions.txt index 1ed55e4..f4dcd46 100644 --- a/corpus/expressions.txt +++ b/corpus/expressions.txt @@ -66,6 +66,27 @@ echo ${abc: (command (command_name (word)) (expansion (variable_name))) (command (command_name (word)) (expansion (variable_name)))) +=================================== +Variable expansions with operators +=================================== + +A="${B[0]# }" +C="${D/#* -E /}" +F="${G%% *}" + +--- + +(program + (variable_assignment + (variable_name) + (string (expansion (subscript (variable_name) (word))))) + (variable_assignment + (variable_name) + (string (expansion (variable_name) (word) (word)))) + (variable_assignment + (variable_name) + (string (expansion (variable_name) (word) (word))))) + =================================== Variable expansions in strings =================================== diff --git a/grammar.js b/grammar.js index dea9244..22426d4 100644 --- a/grammar.js +++ b/grammar.js @@ -322,9 +322,7 @@ module.exports = grammar({ seq( $.variable_name, '=', - optional(seq( - $._expression - )) + optional($._expression) ), seq( choice( @@ -332,11 +330,9 @@ module.exports = grammar({ $._simple_variable_name, $._special_variable_name ), - optional(seq( - choice(':', ':?', '=', ':-', '%', '/', '-'), - optional(seq( - $._expression - )) + repeat(choice( + $._expression, + ':', ':?', '=', ':-', '%', '/', '-', '#' )) ), ),