anchor.diff:      ;
   
   /** An open block is not allowed to have closure arguments. */
  -openBlock
  -    :   lc:LCURLY^ nls!     {#lc.setType(SLIST);}
  +openBlock  {Token first = LT(1);}
  +    :   LCURLY! nls! 
           // AST type of SLIST means "never gonna be a closure"
  -        blockBody[EOF]
  +        bb:blockBody[EOF]!
           RCURLY!
  +        {#openBlock = #(create(SLIST,"{",first,LT(1)),bb);}
  +        
       ;
   
   /** A block body is a parade of zero or more statements or expressions. */
  
positive.code:                                   modifiers,IDENT,tp,ie,ib);}
      ;
  
  enumDefinition![AST modifiers]  {Token first = LT(1); AST prevCurrentClass = currentClass;}
      :   "enum" IDENT
              { currentClass = #IDENT; }
          nls!
  
negative.code:         :   // lookahead to check if we're entering an 'else' clause
              ( (sep!)? "else"! )=>
              (sep!)?  // allow SEMI here for compatibility with Java
              "else"! nlsWarn! elseCbs:compatibleBodyStatement!
          )?
          {#statement = #(create(LITERAL_if,"if",first,LT(1)),ale,ifCbs,elseCbs);}
  
      // For statement
      |   forStatement
  
      // While statement
      |   "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
  