示例#1
0
 public object VisitWhileStmt(Stmt.While stmt)
 {
     Resolve(stmt.condition);
     Resolve(stmt.body);
     return(null);
 }
示例#2
0
        // our first desugaring
        private Stmt ForStatement()
        {
            loopDepth++;

            try
            {
                Consume(Token.TokenType.LeftParenthesis, "Expect '(' after 'for'.");

                Stmt initializer;
                if (Match(Token.TokenType.Semicolon))
                {
                    initializer = null;
                }
                else if (Match(Token.TokenType.Var))
                {
                    initializer = VarDeclaration();
                }
                else
                {
                    initializer = ExpressionStatement();
                }

                Expr condition = null;
                if (!Check(Token.TokenType.Semicolon))
                {
                    condition = Expression();
                }
                Consume(Token.TokenType.Semicolon, "Expect ';' after loop condition.");

                Expr increment = null;
                if (!Check(Token.TokenType.RightParenthesis))
                {
                    increment = Expression();
                }
                Consume(Token.TokenType.RightParenthesis, "Expect ')' after for clauses.");

                Stmt body = Statement();

                if (increment != null)
                {
                    body = new Stmt.Block(
                        new List <Stmt>()
                    {
                        body,
                        new Stmt.Expression(increment)
                    }
                        );
                }

                if (condition == null)
                {
                    condition = new Expr.Literal(true);
                }
                body = new Stmt.While(condition, body);

                if (initializer != null)
                {
                    body = new Stmt.Block(
                        new List <Stmt>()
                    {
                        initializer,
                        body
                    }
                        );
                }

                return(body);
            }
            finally
            {
                loopDepth--;
            }
        }