gc: clean up if grammar

Fixes #2248.

R=ken2
CC=golang-dev
https://golang.org/cl/4978064
diff --git a/src/cmd/gc/go.errors b/src/cmd/gc/go.errors
index b5af467..e29cfff 100644
--- a/src/cmd/gc/go.errors
+++ b/src/cmd/gc/go.errors
@@ -67,4 +67,7 @@
 	
 	% loadsys package imports LFUNC LNAME '(' ')' '{' LFUNC LNAME
 	"nested func not allowed",
+
+	% loadsys package imports LFUNC LNAME '(' ')' '{' LIF if_header loop_body LELSE ';'
+	"else must be followed by if or statement block"
 };
diff --git a/src/cmd/gc/go.y b/src/cmd/gc/go.y
index a5e92bd..0c007f5 100644
--- a/src/cmd/gc/go.y
+++ b/src/cmd/gc/go.y
@@ -57,7 +57,7 @@
 %type	<node>	compound_stmt dotname embed expr complitexpr
 %type	<node>	expr_or_type
 %type	<node>	fndcl fnliteral
-%type	<node>	for_body for_header for_stmt if_header if_stmt non_dcl_stmt
+%type	<node>	for_body for_header for_stmt if_header if_stmt else non_dcl_stmt
 %type	<node>	interfacedcl keyval labelname name
 %type	<node>	name_or_type non_expr_type
 %type	<node>	new_name dcl_name oexpr typedclname
@@ -640,6 +640,7 @@
 		$$->ntest = $3;
 	}
 
+/* IF cond body (ELSE IF cond body)* (ELSE block)? */
 if_stmt:
 	LIF
 	{
@@ -652,9 +653,27 @@
 	}
 	loop_body
 	{
+		$3->nbody = $5;
+	}
+	else
+	{
+		popdcl();
 		$$ = $3;
-		$$->nbody = $5;
-		// no popdcl; maybe there's an LELSE
+		if($7 != N)
+			$$->nelse = list1($7);
+	}
+
+else:
+	{
+		$$ = N;
+	}
+|	LELSE if_stmt
+	{
+		$$ = $2;
+	}
+|	LELSE compound_stmt
+	{
+		$$ = $2;
 	}
 
 switch_stmt:
@@ -1474,19 +1493,6 @@
 |	switch_stmt
 |	select_stmt
 |	if_stmt
-	{
-		popdcl();
-		$$ = $1;
-	}
-|	if_stmt LELSE stmt
-	{
-		if($3->op != OIF && $3->op != OBLOCK)
-			yyerror("missing { } after else");
-
-		popdcl();
-		$$ = $1;
-		$$->nelse = list1($3);
-	}
 |	labelname ':'
 	{
 		$1 = nod(OLABEL, $1, N);
diff --git a/test/syntax/else.go b/test/syntax/else.go
new file mode 100644
index 0000000..186d595
--- /dev/null
+++ b/test/syntax/else.go
@@ -0,0 +1,12 @@
+// errchk $G $D/$F.go
+
+// Copyright 2011 The Go Authors.  All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+func main() {
+	if true {
+	} else ;  // ERROR "else must be followed by if or statement block"
+}