Ejemplo n.º 1
0
 public If(Expr condition, Stmt thenBranch, Stmt elseBranch)
 {
     this.condition  = condition;
     this.thenBranch = thenBranch;
     this.elseBranch = elseBranch;
 }
Ejemplo n.º 2
0
 private void Resolve(Stmt stmt)
 {
     stmt.Accept(this);
 }
Ejemplo n.º 3
0
 public While(Expr condition, Stmt body)
 {
     this.condition = condition;
     this.body      = body;
 }
Ejemplo n.º 4
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--;
            }
        }