Problems reported:

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

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

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

parser/error_recovery/empty_for:2:8: 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 ')'., {token: )}], ), ))
          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 ')'., {token: )}], ), ))
          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, )
