public final void exprASSIGN() throws RecognitionException
    {
        Token op = null;
        
        AST ast1 = null, ast2 = null;
        int type = 0;
        
        try {
            // CPP.g:512:3: ( exprLOGICAL_OR (op= '=' | op= '+=' | op= '-=' | op= '*=' | op= '/=' |
            // op= '%=' | op= '<<=' | op= '>>=' | op= '&=' | op= '^=' | op= '|=' ) exprASSIGN |
            // exprTERNARY )
            int alt29 = 2;
            alt29 = this.dfa29.predict(this.input);
            switch (alt29)
            {
                case 1:
                    // CPP.g:512:5: exprLOGICAL_OR (op= '=' | op= '+=' | op= '-=' | op= '*=' | op=
                    // '/=' | op= '%=' | op= '<<=' | op= '>>=' | op= '&=' | op= '^=' | op= '|=' )
                    // exprASSIGN
                {
                    this.pushFollow(FOLLOW_exprLOGICAL_OR_in_exprASSIGN2078);
                    this.exprLOGICAL_OR();
                    
                    this.state._fsp--;
                    if (this.state.failed) {
                        return;
                    }
                    if (this.state.backtracking == 0) {
                        ast1 = this.out;
                        this.out = null;
                    }
                    // CPP.g:513:5: (op= '=' | op= '+=' | op= '-=' | op= '*=' | op= '/=' | op= '%='
                    // | op= '<<=' | op= '>>=' | op= '&=' | op= '^=' | op= '|=' )
                    int alt28 = 11;
                    switch (this.input.LA(1))
                    {
                        case 27:
                        {
                            alt28 = 1;
                        }
                            break;
                        case 57:
                        {
                            alt28 = 2;
                        }
                            break;
                        case 58:
                        {
                            alt28 = 3;
                        }
                            break;
                        case 59:
                        {
                            alt28 = 4;
                        }
                            break;
                        case 60:
                        {
                            alt28 = 5;
                        }
                            break;
                        case 61:
                        {
                            alt28 = 6;
                        }
                            break;
                        case 62:
                        {
                            alt28 = 7;
                        }
                            break;
                        case 63:
                        {
                            alt28 = 8;
                        }
                            break;
                        case 64:
                        {
                            alt28 = 9;
                        }
                            break;
                        case 65:
                        {
                            alt28 = 10;
                        }
                            break;
                        case 66:
                        {
                            alt28 = 11;
                        }
                            break;
                        default:
                            if (this.state.backtracking > 0) {
                                this.state.failed = true;
                                return;
                            }
                            NoViableAltException nvae = new NoViableAltException("", 28, 0, this.input);
                            
                            throw nvae;
                    }
                    
                    switch (alt28)
                    {
                        case 1:
                            // CPP.g:513:7: op= '='
                        {
                            op = (Token) this.match(this.input, 27, FOLLOW_27_in_exprASSIGN2090);
                            if (this.state.failed) {
                                return;
                            }
                            if (this.state.backtracking == 0) {
                                type = BinExprAST.ASSIGN;
                            }
                            
                        }
                            break;
                        case 2:
                            // CPP.g:514:7: op= '+='
                        {
                            op = (Token) this.match(this.input, 57, FOLLOW_57_in_exprASSIGN2104);
                            if (this.state.failed) {
                                return;
                            }
                            if (this.state.backtracking == 0) {
                                type = BinExprAST.PLUS_ASSIGN;
                            }
                            
                        }
                            break;
                        case 3:
                            // CPP.g:515:7: op= '-='
                        {
                            op = (Token) this.match(this.input, 58, FOLLOW_58_in_exprASSIGN2117);
                            if (this.state.failed) {
                                return;
                            }
                            if (this.state.backtracking == 0) {
                                type = BinExprAST.MINUS_ASSIGN;
                            }
                            
                        }
                            break;
                        case 4:
                            // CPP.g:516:7: op= '*='
                        {
                            op = (Token) this.match(this.input, 59, FOLLOW_59_in_exprASSIGN2130);
                            if (this.state.failed) {
                                return;
                            }
                            if (this.state.backtracking == 0) {
                                type = BinExprAST.STAR_ASSIGN;
                            }
                            
                        }
                            break;
                        case 5:
                            // CPP.g:517:7: op= '/='
                        {
                            op = (Token) this.match(this.input, 60, FOLLOW_60_in_exprASSIGN2143);
                            if (this.state.failed) {
                                return;
                            }
                            if (this.state.backtracking == 0) {
                                type = BinExprAST.DIV_ASSIGN;
                            }
                            
                        }
                            break;
                        case 6:
                            // CPP.g:518:7: op= '%='
                        {
                            op = (Token) this.match(this.input, 61, FOLLOW_61_in_exprASSIGN2156);
                            if (this.state.failed) {
                                return;
                            }
                            if (this.state.backtracking == 0) {
                                type = BinExprAST.MOD_ASSIGN;
                            }
                            
                        }
                            break;
                        case 7:
                            // CPP.g:519:7: op= '<<='
                        {
                            op = (Token) this.match(this.input, 62, FOLLOW_62_in_exprASSIGN2169);
                            if (this.state.failed) {
                                return;
                            }
                            if (this.state.backtracking == 0) {
                                type = BinExprAST.SHIFT_LEFT_ASSIGN;
                            }
                            
                        }
                            break;
                        case 8:
                            // CPP.g:520:7: op= '>>='
                        {
                            op = (Token) this.match(this.input, 63, FOLLOW_63_in_exprASSIGN2181);
                            if (this.state.failed) {
                                return;
                            }
                            if (this.state.backtracking == 0) {
                                type = BinExprAST.SHIFT_RIGHT_ASSIGN;
                            }
                            
                        }
                            break;
                        case 9:
                            // CPP.g:521:7: op= '&='
                        {
                            op = (Token) this.match(this.input, 64, FOLLOW_64_in_exprASSIGN2193);
                            if (this.state.failed) {
                                return;
                            }
                            if (this.state.backtracking == 0) {
                                type = BinExprAST.AND_ASSIGN;
                            }
                            
                        }
                            break;
                        case 10:
                            // CPP.g:522:7: op= '^='
                        {
                            op = (Token) this.match(this.input, 65, FOLLOW_65_in_exprASSIGN2206);
                            if (this.state.failed) {
                                return;
                            }
                            if (this.state.backtracking == 0) {
                                type = BinExprAST.XOR_ASSIGN;
                            }
                            
                        }
                            break;
                        case 11:
                            // CPP.g:523:7: op= '|='
                        {
                            op = (Token) this.match(this.input, 66, FOLLOW_66_in_exprASSIGN2219);
                            if (this.state.failed) {
                                return;
                            }
                            if (this.state.backtracking == 0) {
                                type = BinExprAST.OR_ASSIGN;
                            }
                            
                        }
                            break;
                        
                    }
                    
                    this.pushFollow(FOLLOW_exprASSIGN_in_exprASSIGN2234);
                    this.exprASSIGN();
                    
                    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 BinExprAST((ExprAST) ast1, type, op, (ExprAST) ast2);
                    }
                    
                }
                    break;
                case 2:
                    // CPP.g:527:5: exprTERNARY
                {
                    this.pushFollow(FOLLOW_exprTERNARY_in_exprASSIGN2248);
                    this.exprTERNARY();
                    
                    this.state._fsp--;
                    if (this.state.failed) {
                        return;
                    }
                    
                }
                    break;
                
            }
        }
        catch (RecognitionException re) {
            this.reportError(re);
            this.recover(this.input, re);
        } finally {
        }
        return;
    }