public final void exprRELATIONEx() throws RecognitionException
    {
        Token op = null;
        
        AST ast1 = null, ast2 = null;
        int type = 0;
        
        try {
            // CPP.g:663:3: ( (op= '>' | op= '>=' | op= '<' | op= '<=' ) exprSHIFT exprRELATIONEx |
            // )
            int alt39 = 2;
            int LA39_0 = this.input.LA(1);
            
            if ((((LA39_0 >= 74) && (LA39_0 <= 77)))) {
                alt39 = 1;
            }
            else if (((LA39_0 == EOF) || ((LA39_0 >= 23) && (LA39_0 <= 24)) || ((LA39_0 >= 26) && (LA39_0 <= 27))
                    || (LA39_0 == 29) || ((LA39_0 >= 43) && (LA39_0 <= 44)) || (LA39_0 == 52) || ((LA39_0 >= 57) && (LA39_0 <= 73)))) {
                alt39 = 2;
            }
            else {
                if (this.state.backtracking > 0) {
                    this.state.failed = true;
                    return;
                }
                NoViableAltException nvae = new NoViableAltException("", 39, 0, this.input);
                
                throw nvae;
            }
            switch (alt39)
            {
                case 1:
                    // CPP.g:663:5: (op= '>' | op= '>=' | op= '<' | op= '<=' ) exprSHIFT
                    // exprRELATIONEx
                {
                    if (this.state.backtracking == 0) {
                        ast1 = this.in;
                    }
                    // CPP.g:664:5: (op= '>' | op= '>=' | op= '<' | op= '<=' )
                    int alt38 = 4;
                    switch (this.input.LA(1))
                    {
                        case 74:
                        {
                            alt38 = 1;
                        }
                            break;
                        case 75:
                        {
                            alt38 = 2;
                        }
                            break;
                        case 76:
                        {
                            alt38 = 3;
                        }
                            break;
                        case 77:
                        {
                            alt38 = 4;
                        }
                            break;
                        default:
                            if (this.state.backtracking > 0) {
                                this.state.failed = true;
                                return;
                            }
                            NoViableAltException nvae = new NoViableAltException("", 38, 0, this.input);
                            
                            throw nvae;
                    }
                    
                    switch (alt38)
                    {
                        case 1:
                            // CPP.g:664:7: op= '>'
                        {
                            op = (Token) this.match(this.input, 74, FOLLOW_74_in_exprRELATIONEx2862);
                            if (this.state.failed) {
                                return;
                            }
                            if (this.state.backtracking == 0) {
                                type = BinExprAST.GREATER_THAN;
                            }
                            
                        }
                            break;
                        case 2:
                            // CPP.g:665:7: op= '>='
                        {
                            op = (Token) this.match(this.input, 75, FOLLOW_75_in_exprRELATIONEx2876);
                            if (this.state.failed) {
                                return;
                            }
                            if (this.state.backtracking == 0) {
                                type = BinExprAST.GREATER_OR_EQUAL;
                            }
                            
                        }
                            break;
                        case 3:
                            // CPP.g:666:7: op= '<'
                        {
                            op = (Token) this.match(this.input, 76, FOLLOW_76_in_exprRELATIONEx2889);
                            if (this.state.failed) {
                                return;
                            }
                            if (this.state.backtracking == 0) {
                                type = BinExprAST.LESS_THAN;
                            }
                            
                        }
                            break;
                        case 4:
                            // CPP.g:667:7: op= '<='
                        {
                            op = (Token) this.match(this.input, 77, FOLLOW_77_in_exprRELATIONEx2903);
                            if (this.state.failed) {
                                return;
                            }
                            if (this.state.backtracking == 0) {
                                type = BinExprAST.LESS_OR_EQUAL;
                            }
                            
                        }
                            break;
                        
                    }
                    
                    this.pushFollow(FOLLOW_exprSHIFT_in_exprRELATIONEx2919);
                    this.exprSHIFT();
                    
                    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.in = new BinExprAST((ExprAST) ast1, type, op, (ExprAST) ast2);
                    }
                    this.pushFollow(FOLLOW_exprRELATIONEx_in_exprRELATIONEx2933);
                    this.exprRELATIONEx();
                    
                    this.state._fsp--;
                    if (this.state.failed) {
                        return;
                    }
                    
                }
                    break;
                case 2:
                    // CPP.g:672:5:
                {
                    if (this.state.backtracking == 0) {
                        this.out = this.in;
                    }
                    
                }
                    break;
                
            }
        }
        catch (RecognitionException re) {
            this.reportError(re);
            this.recover(this.input, re);
        } finally {
        }
        return;
    }