diff options
author | P. J. McDermott <pj@pehjota.net> | 2016-02-20 13:55:44 (EST) |
---|---|---|
committer | P. J. McDermott <pj@pehjota.net> | 2016-02-20 13:57:09 (EST) |
commit | e978b31de0d40fe2054327f9adfc78b9d3fc0e1d (patch) | |
tree | 4635dba4e1be4e9d73891019d7bf0fa595e2d263 /parsing | |
parent | 39b80f0ea4ac78c29799cffd8c81f701fd2ae222 (diff) | |
download | eggshell-e978b31de0d40fe2054327f9adfc78b9d3fc0e1d.zip eggshell-e978b31de0d40fe2054327f9adfc78b9d3fc0e1d.tar.gz eggshell-e978b31de0d40fe2054327f9adfc78b9d3fc0e1d.tar.bz2 |
Don't eat the first token after a command substitution
Diffstat (limited to 'parsing')
-rw-r--r-- | parsing/lexer.sh | 13 | ||||
-rw-r--r-- | parsing/parse.sh | 18 |
2 files changed, 15 insertions, 16 deletions
diff --git a/parsing/lexer.sh b/parsing/lexer.sh index 6e2c4f4..928021e 100644 --- a/parsing/lexer.sh +++ b/parsing/lexer.sh @@ -410,17 +410,8 @@ scan_wordexp() res="${res#*${RS}}" toks="${res%%${RS}*}" lineno=${ln_off} - wordexp="\$(${STX}${toks}${ETX}" - # Get ")" - case "${c}" in - ')') - wordexp="${wordexp}${c}" - pgetc - ;; - *) - synerr 'Missing ")"' - ;; - esac + wordexp="\$(${STX}${toks}${ETX})" + # ")" is recognized in parse_sub(). ;; esac ;; diff --git a/parsing/parse.sh b/parsing/parse.sh index da9b2e5..d9fb6a1 100644 --- a/parsing/parse.sh +++ b/parsing/parse.sh @@ -600,14 +600,19 @@ parse_sub() if ${complete} && ! accept T_EOF; then synexp '' fi + if ! ${complete}; then + case "${tok%${US}*}" in + T_RPAREN) + ;; + *) + synerr 'Missing ")"' + ;; + esac + fi get_lineno printf '%c' "${RS}" - if accept T_RPAREN; then - printf ')' - else - get_lexer_char - fi + get_lexer_char printf '%c' "${RS}" get_tokens @@ -675,4 +680,7 @@ try() #try 'case foo in bar) baz;; (qux) quux;; quux);; esac' #try 'foo bar ( baz )' try 'foo $(bar)' +try 'foo $(bar); baz' +try 'foo $(bar)' 'baz' +try 'foo $(bar) baz' #try 'foo $((1 + 1))' |