diff --git a/osh/word_parse.py b/osh/word_parse.py index d408d7b577..4145d00c40 100644 --- a/osh/word_parse.py +++ b/osh/word_parse.py @@ -366,7 +366,7 @@ def _ParseVarExpr(self, arg_lex_mode): token=self.cur_token) else: - p_die('Unexpected token %s', self.cur_token, token=self.cur_token) + p_die('Unexpected token %r', self.cur_token.val, token=self.cur_token) part.suffix_op = op @@ -497,7 +497,7 @@ def _ReadBracedBracedVarSub(self, d_quoted=False): else: # e.g. ${^} - p_die('Unexpected token %s', self.cur_token, token=self.cur_token) + p_die('Unexpected token %r', self.cur_token.val, token=self.cur_token) part.spids.append(left_spid) diff --git a/test/parse-errors.sh b/test/parse-errors.sh index c471006999..badce07413 100755 --- a/test/parse-errors.sh +++ b/test/parse-errors.sh @@ -50,6 +50,13 @@ patsub() { # osh/word_parse.py word-parse() { set +o errexit + + _error-case 'echo ${' + + # This parses like a slice, but that's OK. Maybe talk about arithmetic + # expression. Maybe say where it started? + _error-case '${foo:}' + _error-case 'echo ${a[@Z' _error-case 'echo ${x.}' @@ -71,10 +78,15 @@ word-parse() { _error-case 'for (( i = 0; i < 10; i++ /' _error-case 'echo @(extglob|foo' +} + +array-literal() { + set +o errexit # Array literal with invalid TokenWord. _error-case 'a=(1 & 2)' _error-case 'a= (1 2)' + _error-case 'a=(1 2' } arith-context() { @@ -83,6 +95,8 @@ arith-context() { # $(( )) _error-case 'echo $(( 1 + 2 ;' _error-case 'echo $(( 1 + 2 );' + _error-case 'echo $(( ' + _error-case 'echo $(( 1' # Non-standard arith sub $[1 + 2] _error-case 'echo $[ 1 + 2 ;' @@ -91,10 +105,13 @@ arith-context() { _error-case 'echo $[ 1 + 2 /' _error-case 'echo $[ 1 + 2 / 3' + _error-case 'echo $[' # (( )) _error-case '(( 1 + 2 /' _error-case '(( 1 + 2 )/' + _error-case '(( 1' + _error-case '((' } arith-expr() { @@ -129,6 +146,9 @@ bool-expr() { _error-case '[[ == ]]' _error-case '[[ ) ]]' _error-case '[[ ( ]]' + + _error-case '[[ ;;; ]]' + _error-case '[[' } quoted-strings() { @@ -149,20 +169,25 @@ quoted-strings() { line 2" } - -cases-in-strings() { +cmd-parse() { set +o errexit _error-case 'echo < <<' - _error-case '${foo:}' - _error-case '$(( 1 + ))' _error-case 'echo $( echo > >> )' - _error-case 'echo ${' +} + +cases-in-strings() { + set +o errexit + + cmd-parse + # Word word-parse + array-literal patsub quoted-strings + # Arith arith-context arith-expr