anchor.diff:  	@init { $l = getStartLine(); $c = getStartColumn(); }
   	@after { $ast.setPositions($l, $c, getEndLine(), getEndColumn()); }
   	: e=forExpressionStatement SEMICOLON { $ast = $e.ast; }
  -	|   forExpressionStatement           { notifyErrorListeners("error: ';' expected"); }
  +	| e=forExpressionStatement           { $ast = $e.ast; notifyErrorListeners("error: ';' expected"); }
   	;
   
   ifStatement returns [IfStatement ast]
  
positive.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); }
  	|   visitorType LBRACE ({ notifyErrorListeners("error: only 'before' and 'after' visit statements allowed inside visitor bodies"); } statement | visitStatement)+ RBRACE
  	;
  
  statementExpression returns [StatementExpr ast]
  
negative.code: 	@init { $l = getStartLine(); $c = getStartColumn(); }
  	@after { $ast.setPositions($l, $c, getEndLine(), getEndColumn()); }
  	: RETURN { $ast = new ReturnStatement(); } (e=expression { $ast.setExpr($e.ast); })? SEMICOLON
  	| RETURN { $ast = new ReturnStatement(); } (e=expression { $ast.setExpr($e.ast); })? { notifyErrorListeners("error: ';' expected"); }
  	;
  
  switchStatement returns [SwitchStatement ast]
  