Index: src/main/org/codehaus/groovy/antlr/AntlrParserPlugin.java =================================================================== --- src/main/org/codehaus/groovy/antlr/AntlrParserPlugin.java (revision 10525) +++ src/main/org/codehaus/groovy/antlr/AntlrParserPlugin.java Mon Jan 21 19:32:14 EST 2008 @@ -1030,7 +1030,13 @@ forParameter = new Parameter(type,variable); } - Statement block = statement(inNode.getNextSibling()); + final AST node = inNode.getNextSibling(); + Statement block; + if (isType(SEMI, node)) { + block = EmptyStatement.INSTANCE; + } else { + block = statement(node); + } ForStatement forStatement = new ForStatement(forParameter, collectionExpression, block); configureAST(forStatement, forNode); return forStatement; Index: src/main/org/codehaus/groovy/antlr/groovy.g =================================================================== --- src/main/org/codehaus/groovy/antlr/groovy.g (revision 10525) +++ src/main/org/codehaus/groovy/antlr/groovy.g Mon Jan 21 19:32:14 EST 2008 @@ -1663,14 +1663,16 @@ forInClause ) RPAREN! nls! - compatibleBodyStatement // statement to loop over + (SEMI | compatibleBodyStatement) // statement to loop over ; closureList {Token first = LT(1); boolean sce=false;} : - sce=strictContextExpression[true] + ( sce=strictContextExpression[true] + | {astFactory.addASTChild(currentAST,astFactory.create(EMPTY_STAT, "EMPTY_STAT"));} + ) ( SEMI! sce=strictContextExpression[true] | SEMI! {astFactory.addASTChild(currentAST,astFactory.create(EMPTY_STAT, "EMPTY_STAT"));}