anchor.diff:   *              John Rose               rose00@mac.com
    *              Jeremy Rayner           groovy@ross-rayner.com
    *              Alex Popescu            the.mindstorm@gmail.com
  + *              Martin Kempf            mkempf@hsr.ch
  + *              Reto Kleeb              rkleeb@hsr.ch
    *
    * Version 1.00 December 9, 1997 -- initial release
    * Version 1.01 December 10, 1997
  
positive.code:     ;
  
  // an exception handler try/catch block
  tryBlock
      :   "try"^ nlsWarn! compoundStatement
              ( options {greedy=true;} :  nls! handler)*
              ( options {greedy=true;} :  nls! finallyClause)?
      ;
  
  finallyClause
      :   "finally"^ nlsWarn! compoundStatement
      ;
  
  // an exception handler
  handler
      :   "catch"^ LPAREN! parameterDeclaration RPAREN! nlsWarn! compoundStatement
      ;
  
  /** A member name (x.y) or element name (x[y]) can serve as a command name,
  
negative.code:  *  Compare this to a block which is appended to a method call,
   *  which is given closure arguments, even if they are not explicit in the code.
   */
  openOrClosableBlock  {Token first = LT(1);}
      :   LCURLY! nls!
          cp:closableBlockParamsOpt[false]!
          bb:blockBody[EOF]!
          RCURLY!
          {   if (#cp == null)    #openOrClosableBlock = #(create(SLIST,"{",first,LT(1)),bb);
  	    else                #openOrClosableBlock = #(create(CLOSABLE_BLOCK,"{",first,LT(1)),cp,bb);
          }
      ;
  
  /** A statement is an element of a block.
  