static Parser<Statement> statement(Parser<Expression> expr) {
Parser.Reference<Statement> ref = Parser.newReference();
Parser<Statement> lazy = ref.lazy();
@SuppressWarnings("unchecked")
Parser<Statement> parser = Parsers.or(
returnStatement(expr), BREAK, CONTINUE, blockStatement(lazy),
foreachStatement(expr, lazy), forStatement(expr, lazy),
whileStatement(expr, lazy), doWhileStatement(lazy, expr),
ifStatement(expr, lazy), switchStatement(expr, lazy),
tryStatement(modifier(expr), lazy), throwStatement(expr),
synchronizedBlock(lazy), assertStatement(expr), varStatement(expr),
thisCall(expr), superCall(expr),
expression(expr), NOP).prefix(LABEL).label("statement");
ref.set(parser);
return parser;
}
}