private Stmt ForStatement() { Consume(TokenType.LeftParen, "Expect '(' after 'for'."); Stmt initializer; if (Match(TokenType.Semicolon)) { initializer = null; } else if (Match(TokenType.Var)) { initializer = VarDeclaration(); } else { initializer = ExpressionStatement(); } Expr condition = null; if (!Check(TokenType.Semicolon)) { condition = Expression(); } Consume(TokenType.Semicolon, "Expect ';' after loop condition."); Expr increment = null; if (!Check(TokenType.RightParen)) { increment = Expression(); } Consume(TokenType.RightParen, "Expect ')' after for clauses."); var body = Statement(); if (increment != null) { body = new BlockStmt(new List <Stmt> { body, new ExpressionStmt(increment) }); } if (condition == null) { condition = new LiteralExpr(true); } body = new WhileStmt(condition, body); if (initializer != null) { body = new BlockStmt(new List <Stmt> { initializer, body }); } return(body); }
public void VisitBlockStmt(BlockStmt stmt) { BeginScope(); Resolve(stmt.Statements); EndScope(); }
public void VisitBlockStmt(BlockStmt stmt) { ExecuteBlock(stmt.Statements, new Environment(environment)); }