[gnu.bash.bug] Bug in bash/parse.y?

jrferro@AI.MIT.EDU (Jon R Ferro) (02/08/90)

It appears that the comment above the rule for 'list' in
apple-gunkies:/home/gd/gnu/bash/parse.y does not match the actual
definition in the file:

=========
    /* A list allows leading or trailing newlines and
       newlines as operators (equivalent to semicolons).
==>    It must end with a newline or semicolon.
       Lists are used within commands such as if, for, while.  */

    list:		newlines list0
			    { $$ = $2; }
	    ;

?=> list0:		list1
	    |	list1 '\n' newlines
	    |	list1 '&' newlines
			    { $$ = command_connect ($1, 0, '&'); }
	    |	list1 ';' newlines

	    ;

    list1:		list1 AND_AND newlines list1
	.....
	    |	command
	    ;

========

By making different choices for the expansion of list0, a list can end
in a semicolon, a carriage return, an ampersand (reasonable, but not
listed) or nothing in particular (a bug?).  I know of no example that
fails specifically because of this, but removing the expansion labelled
'?=>' may cause better detection of syntax errors for cases like this:

    bash$ for file in *; do if test -d $file then ls -d $file; fi; done
					    ^		     
					    missing semicolon

for which bash only gives the error "syntax error near `;'".

Another possible correction to this wretched error message is the
addition of "error clauses" to the rule for shell_command such as:

    shell_command:
	    ....
	    |	IF list FI
			    { report_syntax_error ("Can't find 'then' (missing semicolon?)");
			      reset_parser ();
			    }

The actual cause of my error in typing that command line and starting
this whole search through the source code to see what was going wrong
was this information given to me by bash itself:

    bash$ help if
    if: if COMMANDS then COMMANDS [else COMMANDS] fi
		   ^		 ^
		   missing semicolons

If nothing else, could this help message be corrected to match those for
CASE and FOR?

Thanks.