public final void exprEQUALITYEx() throws RecognitionException
    {
        Token op = null;
        
        AST ast1 = null, ast2 = null;
        int type = 0;
        
        try {
            // CPP.g:643:3: ( (op= '==' | op= '!=' ) exprRELATION exprEQUALITYEx | )
            int alt37 = 2;
            int LA37_0 = this.input.LA(1);
            
            if ((((LA37_0 >= 72) && (LA37_0 <= 73)))) {
                alt37 = 1;
            }
            else if (((LA37_0 == EOF) || ((LA37_0 >= 23) && (LA37_0 <= 24)) || ((LA37_0 >= 26) && (LA37_0 <= 27))
                    || (LA37_0 == 29) || ((LA37_0 >= 43) && (LA37_0 <= 44)) || (LA37_0 == 52) || ((LA37_0 >= 57) && (LA37_0 <= 71)))) {
                alt37 = 2;
            }
            else {
                if (this.state.backtracking > 0) {
                    this.state.failed = true;
                    return;
                }
                NoViableAltException nvae = new NoViableAltException("", 37, 0, this.input);
                
                throw nvae;
            }
            switch (alt37)
            {
                case 1:
                    // CPP.g:643:5: (op= '==' | op= '!=' ) exprRELATION exprEQUALITYEx
                {
                    if (this.state.backtracking == 0) {
                        ast1 = this.in;
                    }
                    // CPP.g:644:5: (op= '==' | op= '!=' )
                    int alt36 = 2;
                    int LA36_0 = this.input.LA(1);
                    
                    if ((LA36_0 == 72)) {
                        alt36 = 1;
                    }
                    else if ((LA36_0 == 73)) {
                        alt36 = 2;
                    }
                    else {
                        if (this.state.backtracking > 0) {
                            this.state.failed = true;
                            return;
                        }
                        NoViableAltException nvae = new NoViableAltException("", 36, 0, this.input);
                        
                        throw nvae;
                    }
                    switch (alt36)
                    {
                        case 1:
                            // CPP.g:644:7: op= '=='
                        {
                            op = (Token) this.match(this.input, 72, FOLLOW_72_in_exprEQUALITYEx2765);
                            if (this.state.failed) {
                                return;
                            }
                            if (this.state.backtracking == 0) {
                                type = BinExprAST.EQUAL;
                            }
                            
                        }
                            break;
                        case 2:
                            // CPP.g:645:7: op= '!='
                        {
                            op = (Token) this.match(this.input, 73, FOLLOW_73_in_exprEQUALITYEx2778);
                            if (this.state.failed) {
                                return;
                            }
                            if (this.state.backtracking == 0) {
                                type = BinExprAST.NOT_EQUAL;
                            }
                            
                        }
                            break;
                        
                    }
                    
                    this.pushFollow(FOLLOW_exprRELATION_in_exprEQUALITYEx2790);
                    this.exprRELATION();
                    
                    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_exprEQUALITYEx_in_exprEQUALITYEx2804);
                    this.exprEQUALITYEx();
                    
                    this.state._fsp--;
                    if (this.state.failed) {
                        return;
                    }
                    
                }
                    break;
                case 2:
                    // CPP.g:650:5:
                {
                    if (this.state.backtracking == 0) {
                        this.out = this.in;
                    }
                    
                }
                    break;
                
            }
        }
        catch (RecognitionException re) {
            this.reportError(re);
            this.recover(this.input, re);
        } finally {
        }
        return;
    }