public final void exprUNARY() throws RecognitionException
    {
        Token op = null;
        
        AST ast1 = null;
        int type = 0;
        
        try {
            // CPP.g:741:3: ( (op= '+' | op= '-' | op= '++' | op= '--' | op= '*' | op= '&' | op= '!'
            // | op= '~' ) exprUNARY | exprPostfix )
            int alt47 = 2;
            int LA47_0 = this.input.LA(1);
            
            if (((LA47_0 == 30) || (LA47_0 == 44) || ((LA47_0 >= 80) && (LA47_0 <= 81)) || ((LA47_0 >= 84) && (LA47_0 <= 87)))) {
                alt47 = 1;
            }
            else if ((((LA47_0 >= IDENTIFIER) && (LA47_0 <= FLOATING_POINT_LITERAL)) || (LA47_0 == 42))) {
                alt47 = 2;
            }
            else {
                if (this.state.backtracking > 0) {
                    this.state.failed = true;
                    return;
                }
                NoViableAltException nvae = new NoViableAltException("", 47, 0, this.input);
                
                throw nvae;
            }
            switch (alt47)
            {
                case 1:
                    // CPP.g:741:5: (op= '+' | op= '-' | op= '++' | op= '--' | op= '*' | op= '&' |
                    // op= '!' | op= '~' ) exprUNARY
                {
                    // CPP.g:741:5: (op= '+' | op= '-' | op= '++' | op= '--' | op= '*' | op= '&' |
                    // op= '!' | op= '~' )
                    int alt46 = 8;
                    switch (this.input.LA(1))
                    {
                        case 80:
                        {
                            alt46 = 1;
                        }
                            break;
                        case 81:
                        {
                            alt46 = 2;
                        }
                            break;
                        case 84:
                        {
                            alt46 = 3;
                        }
                            break;
                        case 85:
                        {
                            alt46 = 4;
                        }
                            break;
                        case 30:
                        {
                            alt46 = 5;
                        }
                            break;
                        case 44:
                        {
                            alt46 = 6;
                        }
                            break;
                        case 86:
                        {
                            alt46 = 7;
                        }
                            break;
                        case 87:
                        {
                            alt46 = 8;
                        }
                            break;
                        default:
                            if (this.state.backtracking > 0) {
                                this.state.failed = true;
                                return;
                            }
                            NoViableAltException nvae = new NoViableAltException("", 46, 0, this.input);
                            
                            throw nvae;
                    }
                    
                    switch (alt46)
                    {
                        case 1:
                            // CPP.g:741:7: op= '+'
                        {
                            op = (Token) this.match(this.input, 80, FOLLOW_80_in_exprUNARY3277);
                            if (this.state.failed) {
                                return;
                            }
                            if (this.state.backtracking == 0) {
                                type = UnaryExprAST.UNARY_PLUS;
                            }
                            
                        }
                            break;
                        case 2:
                            // CPP.g:742:7: op= '-'
                        {
                            op = (Token) this.match(this.input, 81, FOLLOW_81_in_exprUNARY3291);
                            if (this.state.failed) {
                                return;
                            }
                            if (this.state.backtracking == 0) {
                                type = UnaryExprAST.UNARY_MINUS;
                            }
                            
                        }
                            break;
                        case 3:
                            // CPP.g:743:7: op= '++'
                        {
                            op = (Token) this.match(this.input, 84, FOLLOW_84_in_exprUNARY3305);
                            if (this.state.failed) {
                                return;
                            }
                            if (this.state.backtracking == 0) {
                                type = UnaryExprAST.PRE_INC;
                            }
                            
                        }
                            break;
                        case 4:
                            // CPP.g:744:7: op= '--'
                        {
                            op = (Token) this.match(this.input, 85, FOLLOW_85_in_exprUNARY3318);
                            if (this.state.failed) {
                                return;
                            }
                            if (this.state.backtracking == 0) {
                                type = UnaryExprAST.PRE_DEC;
                            }
                            
                        }
                            break;
                        case 5:
                            // CPP.g:745:7: op= '*'
                        {
                            op = (Token) this.match(this.input, 30, FOLLOW_30_in_exprUNARY3331);
                            if (this.state.failed) {
                                return;
                            }
                            if (this.state.backtracking == 0) {
                                type = UnaryExprAST.INDIRECTION;
                            }
                            
                        }
                            break;
                        case 6:
                            // CPP.g:746:7: op= '&'
                        {
                            op = (Token) this.match(this.input, 44, FOLLOW_44_in_exprUNARY3345);
                            if (this.state.failed) {
                                return;
                            }
                            if (this.state.backtracking == 0) {
                                type = UnaryExprAST.ADDR_OF;
                            }
                            
                        }
                            break;
                        case 7:
                            // CPP.g:747:7: op= '!'
                        {
                            op = (Token) this.match(this.input, 86, FOLLOW_86_in_exprUNARY3359);
                            if (this.state.failed) {
                                return;
                            }
                            if (this.state.backtracking == 0) {
                                type = UnaryExprAST.LOGICAL_NOT;
                            }
                            
                        }
                            break;
                        case 8:
                            // CPP.g:748:7: op= '~'
                        {
                            op = (Token) this.match(this.input, 87, FOLLOW_87_in_exprUNARY3373);
                            if (this.state.failed) {
                                return;
                            }
                            if (this.state.backtracking == 0) {
                                type = UnaryExprAST.NOT;
                            }
                            
                        }
                            break;
                        
                    }
                    
                    this.pushFollow(FOLLOW_exprUNARY_in_exprUNARY3389);
                    this.exprUNARY();
                    
                    this.state._fsp--;
                    if (this.state.failed) {
                        return;
                    }
                    if (this.state.backtracking == 0) {
                        ast1 = this.out;
                        this.out = null;
                    }
                    if (this.state.backtracking == 0) {
                        this.out = new UnaryExprAST(type, op, (ExprAST) ast1);
                    }
                    
                }
                    break;
                case 2:
                    // CPP.g:752:5: exprPostfix
                {
                    this.pushFollow(FOLLOW_exprPostfix_in_exprUNARY3404);
                    this.exprPostfix();
                    
                    this.state._fsp--;
                    if (this.state.failed) {
                        return;
                    }
                    
                }
                    break;
                
            }
        }
        catch (RecognitionException re) {
            this.reportError(re);
            this.recover(this.input, re);
        } finally {
        }
        return;
    }