public final void arrayDecl() throws RecognitionException
    {
        
        AST ast1 = null, ast2 = null;
        
        try {
            // CPP.g:118:3: ( ( '[' expr ']' | '[' ']' ) arrayDecl | )
            int alt7 = 2;
            int LA7_0 = this.input.LA(1);
            
            if ((LA7_0 == 25)) {
                alt7 = 1;
            }
            else if (((LA7_0 == EOF) || ((LA7_0 >= 23) && (LA7_0 <= 24)) || (LA7_0 == 27) || (LA7_0 == 43))) {
                alt7 = 2;
            }
            else {
                if (this.state.backtracking > 0) {
                    this.state.failed = true;
                    return;
                }
                NoViableAltException nvae = new NoViableAltException("", 7, 0, this.input);
                
                throw nvae;
            }
            switch (alt7)
            {
                case 1:
                    // CPP.g:118:5: ( '[' expr ']' | '[' ']' ) arrayDecl
                {
                    // CPP.g:118:5: ( '[' expr ']' | '[' ']' )
                    int alt6 = 2;
                    int LA6_0 = this.input.LA(1);
                    
                    if ((LA6_0 == 25)) {
                        int LA6_1 = this.input.LA(2);
                        
                        if ((LA6_1 == 26)) {
                            alt6 = 2;
                        }
                        else if ((((LA6_1 >= IDENTIFIER) && (LA6_1 <= FLOATING_POINT_LITERAL)) || (LA6_1 == 30)
                                || (LA6_1 == 42) || (LA6_1 == 44) || ((LA6_1 >= 80) && (LA6_1 <= 81)) || ((LA6_1 >= 84) && (LA6_1 <= 87)))) {
                            alt6 = 1;
                        }
                        else {
                            if (this.state.backtracking > 0) {
                                this.state.failed = true;
                                return;
                            }
                            NoViableAltException nvae = new NoViableAltException("", 6, 1, this.input);
                            
                            throw nvae;
                        }
                    }
                    else {
                        if (this.state.backtracking > 0) {
                            this.state.failed = true;
                            return;
                        }
                        NoViableAltException nvae = new NoViableAltException("", 6, 0, this.input);
                        
                        throw nvae;
                    }
                    switch (alt6)
                    {
                        case 1:
                            // CPP.g:118:7: '[' expr ']'
                        {
                            this.match(this.input, 25, FOLLOW_25_in_arrayDecl365);
                            if (this.state.failed) {
                                return;
                            }
                            this.pushFollow(FOLLOW_expr_in_arrayDecl367);
                            this.expr();
                            
                            this.state._fsp--;
                            if (this.state.failed) {
                                return;
                            }
                            this.match(this.input, 26, FOLLOW_26_in_arrayDecl369);
                            if (this.state.failed) {
                                return;
                            }
                            if (this.state.backtracking == 0) {
                                ast1 = this.out;
                                this.out = null;
                            }
                            
                        }
                            break;
                        case 2:
                            // CPP.g:119:7: '[' ']'
                        {
                            this.match(this.input, 25, FOLLOW_25_in_arrayDecl379);
                            if (this.state.failed) {
                                return;
                            }
                            this.match(this.input, 26, FOLLOW_26_in_arrayDecl381);
                            if (this.state.failed) {
                                return;
                            }
                            if (this.state.backtracking == 0) {
                                ast1 = new NullExprAST();
                            }
                            
                        }
                            break;
                        
                    }
                    
                    this.pushFollow(FOLLOW_arrayDecl_in_arrayDecl391);
                    this.arrayDecl();
                    
                    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 ExprListAST((ExprAST) ast1, (ExprListAST) ast2);
                    }
                    
                }
                    break;
                case 2:
                    // CPP.g:122:5:
                {
                    if (this.state.backtracking == 0) {
                        this.out = new EmptyExprListAST();
                    }
                    
                }
                    break;
                
            }
        }
        catch (RecognitionException re) {
            this.reportError(re);
            this.recover(this.input, re);
        } finally {
        }
        return;
    }