anchor.diff:      : expression 
         { $expressionStatement = new ExpressionStatement(null); 
           $expressionStatement.setExpression($expression.expression); } 
  -      ';'
  +      (
  +        SEMICOLON
  +      | { displayRecognitionError(getTokenNames(), new MismatchedTokenException(SEMICOLON, input)); }
  +        COMMA
  +      )
       ;
   directiveStatement returns [Directive directive]
       : d=directive 
  
positive.code:         r.setExpression(e);
          $block.addStatement(r); }
      //-> ^(BLOCK ^(RETURN ^(EXPRESSION ^(INVOCATION_EXPRESSION ^(BASE_TYPE_EXPRESSION { ((CommonTree)$mt).getChild(0) } { ((CommonTree)$mt).getChild(1) } ) namedArguments))))
      | b=block //if there is a "return" directive or control structure, it must be a block
        { $block=$b.block; }
      ;
  
  blockOrNamedArguments returns [boolean foundStatement, boolean foundExpressionList]
      : LBRACE 
        argumentsOrStatements
        { $foundStatement=$argumentsOrStatements.foundStatement; 
          $foundExpressionList=$argumentsOrStatements.foundExpressionList; }
        RBRACE
      ;
      
  argumentsOrStatements returns [boolean foundStatement, boolean foundExpressionList]
      @init { $foundStatement=false; 
              $foundExpressionList=false; }
      : compilerAnnotations 
      (
        (annotatedDeclarationStart) 
        => declaration //TODO: some declarations not allowd in named arg lists!
        ( 
          as1=argumentsOrStatements
          { $foundStatement=$as1.foundStatement; 
            $foundExpressionList=$as1.foundExpressionList; }
        )?
      | (
          ( 
            controlStatement { $foundStatement=true; } 
          | directiveStatement { $foundStatement=true; } 
          ) 
          (
            as2=argumentsOrStatements
            { $foundExpressionList=$as2.foundExpressionList; }
          )?
        | specificationStatement
          (
            as3=argumentsOrStatements
            { $foundStatement=$as3.foundStatement; 
              $foundExpressionList=$as3.foundExpressionList; }
          )?
        | expression 
          (
            SEMICOLON 
            { $foundStatement=true; } 
            (
              as4=argumentsOrStatements
              { $foundExpressionList=$as4.foundExpressionList; }
            )?
        //-> ^(EXPRESSION_STATEMENT expression) brokenMemberBody?
          | ( COMMA {$foundExpressionList=true;} expression )* 
        //-> ^(EXPRESSION_LIST expression+)
          )
        )
      )
      ;
  
  extendedType returns [ExtendedType extendedType]
  
negative.code: //finish parsing it
  memberBody[StaticType type] returns [Block block]
        //options { memoize=true; }
      : 
      {$type instanceof BaseType}? 
      (
        (namedArguments)
        => namedArguments //first try to match with no directives or control structures
        { $block = new Block(null);
          SimpleType t = (SimpleType) $type;
          Return r = new Return(null);
  