private ForStatement ForStatement(ParseNode node) { var forStatement = new ForStatement(); _enclosure = forStatement; _scopes.Push(new VarScope()); var children = node.Children; children.Skip(TokenTag.FOR); children.Skip(TokenTag.OPEN_PAREN); var declarations = children.Check(ParseNodeTag.VarDeclaration) ? children.GetAndMove(VarDeclarations) : new List <VarDeclaration>(); children.Skip(TokenTag.SEMICOLON); var condition = children.Check(child => !child.IsTerminal) ? children.GetAndMove(Expression) : new EmptyExpression(); children.Skip(TokenTag.SEMICOLON); var postIteration = children.Check(child => !child.IsTerminal) ? children.GetAndMove(StatementExpression) : new EmptyExpression(); children.Skip(TokenTag.CLOSE_PAREN); var body = children.GetAndMove(Statement); _scopes.Pop(); forStatement.Init(declarations, condition, postIteration, body); return(forStatement); }