]> Cypherpunks repositories - gostls13.git/commitdiff
gc: clean up if grammar
authorRuss Cox <rsc@golang.org>
Mon, 12 Sep 2011 19:52:29 +0000 (15:52 -0400)
committerRuss Cox <rsc@golang.org>
Mon, 12 Sep 2011 19:52:29 +0000 (15:52 -0400)
Fixes #2248.

R=ken2
CC=golang-dev
https://golang.org/cl/4978064

src/cmd/gc/go.errors
src/cmd/gc/go.y
test/syntax/else.go [new file with mode: 0644]

index b5af4678c91027fd5ab5d06b7d13ffc50ee0cee2..e29cfff5bd498385b096fc0a9a913b97ad1ca010 100644 (file)
@@ -67,4 +67,7 @@ static struct {
        
        % 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"
 };
index a5e92bd4d436704d318c85b2289c6d97ff11fa31..0c007f5f0b4a963c73351388249b8d325eb21dc4 100644 (file)
@@ -57,7 +57,7 @@ static void fixlbrace(int);
 %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 @@ if_header:
                $$->ntest = $3;
        }
 
+/* IF cond body (ELSE IF cond body)* (ELSE block)? */
 if_stmt:
        LIF
        {
@@ -652,9 +653,27 @@ if_stmt:
        }
        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 @@ non_dcl_stmt:
 |      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 (file)
index 0000000..186d595
--- /dev/null
@@ -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"
+}