private ForStatementSyntax ParseForStatement(List<AttributeSyntax> attributes)
{
var @for = Match(SyntaxKind.ForKeyword);
var openParen = Match(SyntaxKind.OpenParenToken);
var resetPoint = GetResetPoint();
ExpressionSyntax initializer = null;
ExpressionSyntax incrementor = null;
// Here can be either a declaration or an expression statement list. Scan
// for a declaration first.
ScanTypeFlags st = ScanType();
VariableDeclarationSyntax decl = null;
if (st != ScanTypeFlags.NotType && Current.Kind == SyntaxKind.IdentifierToken)
{
Reset(ref resetPoint);
decl = ParseVariableDeclaration();
}
else
{
// Not a type followed by an identifier, so it must be an expression list.
Reset(ref resetPoint);
if (Current.Kind != SyntaxKind.SemiToken)
initializer = ParseExpression();
}
var semi = Match(SyntaxKind.SemiToken);
ExpressionSyntax condition = null;
if (Current.Kind != SyntaxKind.SemiToken)
condition = ParseExpression();
var semi2 = Match(SyntaxKind.SemiToken);
if (Current.Kind != SyntaxKind.CloseParenToken)
incrementor = ParseExpression();
var closeParen = Match(SyntaxKind.CloseParenToken);
var statement = ParseEmbeddedStatement();
return new ForStatementSyntax(attributes, @for, openParen, decl,
initializer, semi, condition, semi2,
incrementor, closeParen, statement);
}