anchor.diff:          :   // lookahead to check if we're entering an 'else' clause
               ( (sep!)? "else"! )=>
               (sep!)?  // allow SEMI here for compatibility with Java
  -            "else"! nlsWarn! compatibleBodyStatement
  +            "else"! nlsWarn! elseCbs:compatibleBodyStatement!
           )?
  +        {#statement = #(create(LITERAL_if,"if",first,LT(1)),ale,ifCbs,elseCbs);}
   
       // For statement
       |   forStatement
   
       // While statement
  -    |   "while"^ LPAREN! sce=strictContextExpression[false] RPAREN! nlsWarn!
  -        (SEMI | compatibleBodyStatement)
  +    |   "while"! LPAREN! sce=while_sce:strictContextExpression[false]! RPAREN! nlsWarn!
  +        (s:SEMI! | while_cbs:compatibleBodyStatement!)
  +    	{
  +    	    if (#s != null) 
  +    	        #statement = #(create(LITERAL_while,"Literal_while",first,LT(1)),while_sce,s);
  +    	    else
  +    	        #statement = #(create(LITERAL_while,"Literal_while",first,LT(1)),while_sce,while_cbs);
  +    	}
   
       /*OBS* no do-while statement in Groovy (too ambiguous)
       // do-while statement
  
positive.code: //TODO - where has superClassClause! production gone???
  
  // Definition of a Java Interface
  interfaceDefinition![AST modifiers]  {Token first = LT(1);}
      :   "interface" IDENT nls!
          // it _might_ have type paramaters
          (tp:typeParameters)?
  
negative.code:         { currentClass = prevCurrentClass; }
      ;
  
  annotationDefinition![AST modifiers]  {Token first = cloneToken(LT(1));
                                        if (modifiers != null) {
                                            first.setLine(modifiers.getLine());
                                            first.setColumn(modifiers.getColumn());
                                        }}
      :   AT "interface" IDENT
          // now parse the body of the annotation
          ab:annotationBlock
  