bug-bash
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: error message for missing fi is not helpful


From: L A Walsh
Subject: Re: error message for missing fi is not helpful
Date: Wed, 12 Sep 2018 19:29:01 -0700
User-agent: Thunderbird




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

[Prev in Thread] Current Thread [Next in Thread]