public final void whileStmt() throws RecognitionException
    {
        
        AST ast1 = null, ast2 = null;
        
        try {
            // CPP.g:389:3: ( 'while' '(' expr ')' stmt )
            // CPP.g:389:5: 'while' '(' expr ')' stmt
            {
                this.match(this.input, 48, FOLLOW_48_in_whileStmt1553);
                if (this.state.failed) {
                    return;
                }
                this.match(this.input, 42, FOLLOW_42_in_whileStmt1560);
                if (this.state.failed) {
                    return;
                }
                this.pushFollow(FOLLOW_expr_in_whileStmt1567);
                this.expr();
                
                this.state._fsp--;
                if (this.state.failed) {
                    return;
                }
                if (this.state.backtracking == 0) {
                    ast1 = this.out;
                    this.out = null;
                }
                this.match(this.input, 43, FOLLOW_43_in_whileStmt1575);
                if (this.state.failed) {
                    return;
                }
                this.pushFollow(FOLLOW_stmt_in_whileStmt1582);
                this.stmt();
                
                this.state._fsp--;
                if (this.state.failed) {
                    return;
                }
                if (this.state.backtracking == 0) {
                    ast2 = this.out;
                    this.out = null;
                }
                if (this.state.backtracking == 0) {
                    this.out = new WhileStmtAST((ExprAST) ast1, (OneStmtAST) ast2);
                }
                
            }
            
        }
        catch (RecognitionException re) {
            this.reportError(re);
            this.recover(this.input, re);
        } finally {
        }
        return;
    }