anchor.diff:  	@init { $l = getStartLine(); $c = getStartColumn(); }
   	@after { $ast.setPositions($l, $c, getEndLine(), getEndColumn()); }
   	: v=forVariableDeclaration SEMICOLON { $ast = $v.ast; }
  -	|   forVariableDeclaration           { notifyErrorListeners("error: ';' expected"); }
  +	| v=forVariableDeclaration           { $ast = $v.ast; notifyErrorListeners("error: ';' expected"); }
   	;
   
   type returns [AbstractType ast]
  
positive.code: 	@init { $l = getStartLine(); $c = getStartColumn(); }
  	@after { $ast.setPositions($l, $c, getEndLine(), getEndColumn()); }
  	: f=factor EQUALS e=expression SEMICOLON { $ast = new AssignmentStatement($f.ast, $e.ast); }
  	|   factor EQUALS   expression           { notifyErrorListeners("error: ';' expected"); }
  	;
  
  block returns [Block ast]
  
negative.code: 	@init { $l = getStartLine(); $c = getStartColumn(); }
  	@after { $ast.setPositions($l, $c, getEndLine(), getEndColumn()); }
  	: t=visitorType LBRACE (s=visitStatement { $b.addStatement($s.ast); })+ RBRACE { $ast = new VisitorExpression($t.ast, $b); }
  	| t=visitorType LBRACE ({ notifyErrorListeners("error: only 'before' and 'after' visit statements allowed inside visitor bodies"); } statement | s=visitStatement { $b.addStatement($s.ast); })+ RBRACE { $ast = new VisitorExpression($t.ast, $b); }
  	;
  
  statementExpression returns [StatementExpr ast]
  