On 9/12/2018 6:35 AM, Chet Ramey wrote:
On 9/12/18 5:17 AM, Manuel Reiter wrote:

Bash Version: 4.4
Patch Level: 12
Release Status: release

++ Description:

When an if statement is not terminated by a fi, bash's error message is
not helpful in locating the problem.

This is tough to do in a bison-generated parser. If someone would like to
build the structures required to keep track of which conditional command
the shell is currently parsing, and incorporate that into an error
message, I'd be happy to look at it.

Chet
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)

I can't speak for formatting or base-specific function usage, but I don't
think there was any of those.

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.

--- (eoftest.sh)
#!/bin/bash

if ((1)); then
   for i in 1 2 3; do



       echo wow

---
./bash eoftest.sh
eoftest.sh: line 10: syntax error: unexpected end of file from line 4.

The wording was just what I threw in.  I don't _need_ attribution for
this if that makes it easier.





--- parse.y.orig	2016-09-11 08:31:46.000000000 -0700
+++ parse.y	2018-09-12 19:14:45.542809731 -0700
@@ -6020,9 +6020,21 @@
         print_offending_line ();
     }
   else
-    {
-      msg = EOF_Reached ? _("syntax error: unexpected end of file") : _("syntax error");
+    { 
+      char * msg0;
+      if (EOF_Reached && word_top>=0) {
+        msg0 = (char *) xmalloc(128*sizeof(char));
+        sprintf(msg0, "syntax error: unexpected end of file from line %d.", word_lineno[word_top]);
+      } 
+      
+      /* if (word_top>=0) {
+	msg = EOF_Reached ? _("syntax error: unexpected end of file from line %d."), word_lineno[word_top] : _("syntax error");
+      } else {
+	msg = EOF_Reached ? _("syntax error: unexpected end of file") : _("syntax error");
+      }*/
+      msg = EOF_Reached ? _(msg0) : _("syntax error");
       parser_error (line_number, "%s", msg);
+      xfree(msg0);
       /* 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. */

Reply via email to