On 13.09.2018 04:29, L A Walsh wrote:
This isn't *exactly* what you wanted, but this gives the line number of the last unmatched statement (but doesn't tell you what the statement was). The diff was against bash-4.4.23 (4.4 base w/23 patches)
Thank you for taking the time to look into this! There seems to be a problem with your code though: if word_top is zero and EOF_Reached is true, you set msg to msg0 without initializing msg0 first.
Reviving the code you commented out (your first attempt?) I came to the attached result. I also added if/fi to the compound commands tracked by word_top. There are probably others that I have missed missed.
Anyway, if you store the word in a separate array where the line # is stored, you _could_ list the matching word, but I suspect just the line it started on would be enough for most users.
I totally agree with that. Thanks and best regards, Manuel
diff --git a/parse.y.orig b/parse.y index f415d2e..76974f0 100644 --- a/parse.y.orig +++ b/parse.y @@ -1000,11 +1000,11 @@ coproc: COPROC shell_command ; if_command: IF compound_list THEN compound_list FI - { $$ = make_if_command ($2, $4, (COMMAND *)NULL); } + { $$ = make_if_command ($2, $4, (COMMAND *)NULL); if (word_top > 0) word_top--; } | IF compound_list THEN compound_list ELSE compound_list FI - { $$ = make_if_command ($2, $4, $6); } + { $$ = make_if_command ($2, $4, $6); if (word_top > 0) word_top--; } | IF compound_list THEN compound_list elif_clause FI - { $$ = make_if_command ($2, $4, $5); } + { $$ = make_if_command ($2, $4, $5); if (word_top > 0) word_top--; } ; @@ -5142,6 +5142,7 @@ got_token: case CASE: case SELECT: case FOR: + case IF: if (word_top < MAX_CASE_NEST) word_top++; word_lineno[word_top] = line_number; @@ -6020,9 +6021,13 @@ report_syntax_error (message) print_offending_line (); } else - { - msg = EOF_Reached ? _("syntax error: unexpected end of file") : _("syntax error"); - parser_error (line_number, "%s", msg); + { + if (EOF_Reached && word_top>=0) { + parser_error(line_number, _("syntax error: unexpected end of file from line %d."), word_lineno[word_top] ); + } else { + msg = EOF_Reached ? _("syntax error: unexpected end of file") : _("syntax error"); + parser_error (line_number, "%s", msg); + } /* When the shell is interactive, this file uses EOF_Reached only for error reporting. Other mechanisms are used to decide whether or not to exit. */