Problems reported:

parser/error_recovery/empty_for:2:8: Expected an identifier, but got ')'.
  for () {}
       ^

parser/error_recovery/empty_for:2:7: Expected ';' after this.
  for () {}
      ^

parser/error_recovery/empty_for:2:8: Expected an identifier, but got ')'.
  for () {}
       ^

parser/error_recovery/empty_for:2:7: Expected ';' after this.
  for () {}
      ^

beginCompilationUnit(main)
  beginMetadataStar(main)
  endMetadataStar(0)
  beginTopLevelMember(main)
    beginTopLevelMethod(, null)
      handleNoType()
      handleIdentifier(main, topLevelFunctionDeclaration)
      handleNoTypeVariables(()
      beginFormalParameters((, MemberKind.TopLevelMethod)
      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      beginBlockFunctionBody({)
        beginForStatement(for)
          handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ')'., Try inserting an identifier before ')'., {lexeme: )}], ), ))
          handleIdentifier(, expression)
          handleNoTypeArguments())
          handleNoArguments())
          handleSend(, ))
          handleForInitializerExpressionStatement(, false)
          handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], (, ()
          handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ')'., Try inserting an identifier before ')'., {lexeme: )}], ), ))
          handleIdentifier(, expression)
          handleNoTypeArguments())
          handleNoArguments())
          handleSend(, ))
          handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], (, ()
          handleExpressionStatement(;)
          handleForLoopParts(for, (, ;, 0)
          beginForStatementBody({)
            beginBlock({, BlockKind(statement))
            endBlock(0, {, }, BlockKind(statement))
          endForStatementBody(})
        endForStatement(})
      endBlockFunctionBody(1, {, })
    endTopLevelMethod(main, null, })
  endTopLevelDeclaration()
endCompilationUnit(1, )
