docs: public final BaseDescr inExpression() throws RecognitionException {
  		BaseDescr result = null;
  
  
  		BaseDescr left =null;
  		ParserRuleReturnScope e1 =null;
  		ParserRuleReturnScope e2 =null;
  
  		 ConstraintConnectiveDescr descr = null; BaseDescr leftDescr = null; BindingDescr binding = null; 
  		try {
  			// src/main/resources/org/drools/compiler/lang/DRL5Expressions.g:314:3: (left= relationalExpression ( ( not_key in_key )=> not_key in= in_key LEFT_PAREN e1= expression ( COMMA e2= expression )* RIGHT_PAREN |in= in_key LEFT_PAREN e1= expression ( COMMA e2= expression )* RIGHT_PAREN )? )
  			// src/main/resources/org/drools/compiler/lang/DRL5Expressions.g:314:5: left= relationalExpression ( ( not_key in_key )=> not_key in= in_key LEFT_PAREN e1= expression ( COMMA e2= expression )* RIGHT_PAREN |in= in_key LEFT_PAREN e1= expression ( COMMA e2= expression )* RIGHT_PAREN )?
  			{
  			pushFollow(FOLLOW_relationalExpression_in_inExpression1533);
  			left=relationalExpression();
  			state._fsp--;
  			if (state.failed) return result;
  			if ( state.backtracking==0 ) { if( buildDescr  ) { result = left; }
  			      if( left instanceof BindingDescr ) {
  			          binding = (BindingDescr)left;
  			          leftDescr = new AtomicExprDescr( binding.getExpression() );
  			      } else {
  			          leftDescr = left;
  			      }
  			    }
  			// src/main/resources/org/drools/compiler/lang/DRL5Expressions.g:323:5: ( ( not_key in_key )=> not_key in= in_key LEFT_PAREN e1= expression ( COMMA e2= expression )* RIGHT_PAREN |in= in_key LEFT_PAREN e1= expression ( COMMA e2= expression )* RIGHT_PAREN )?
  			int alt36=3;
  			int LA36_0 = input.LA(1);
  			if ( (LA36_0==ID) ) {
  				int LA36_1 = input.LA(2);
  				if ( (LA36_1==ID) ) {
  					int LA36_3 = input.LA(3);
  					if ( (LA36_3==LEFT_PAREN) && ((((helper.validateIdentifierKey(DroolsSoftKeywords.NOT)))&&synpred7_DRL5Expressions()))) {
  						alt36=1;
  					}
  				}
  				else if ( (LA36_1==LEFT_PAREN) && (((helper.validateIdentifierKey(DroolsSoftKeywords.IN))))) {
  					alt36=2;
  				}
  			}
  			switch (alt36) {
  				case 1 :
  					// src/main/resources/org/drools/compiler/lang/DRL5Expressions.g:323:6: ( not_key in_key )=> not_key in= in_key LEFT_PAREN e1= expression ( COMMA e2= expression )* RIGHT_PAREN
  					{
  					pushFollow(FOLLOW_not_key_in_inExpression1553);
  					not_key();
  					state._fsp--;
  					if (state.failed) return result;
  					pushFollow(FOLLOW_in_key_in_inExpression1557);
  					in_key();
  					state._fsp--;
  					if (state.failed) return result;
  					match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_inExpression1559); if (state.failed) return result;
  					if ( state.backtracking==0 ) {   helper.emit( Location.LOCATION_LHS_INSIDE_CONDITION_ARGUMENT ); }
  					pushFollow(FOLLOW_expression_in_inExpression1581);
  					e1=expression();
  					state._fsp--;
  					if (state.failed) return result;
  					if ( state.backtracking==0 ) {   descr = ConstraintConnectiveDescr.newAnd();
  					            RelationalExprDescr rel = new RelationalExprDescr( "!=", false, null, leftDescr, (e1!=null?((DRL5Expressions.expression_return)e1).result:null) );
  					            descr.addOrMerge( rel );
  					            result = descr;
  					        }
  					// src/main/resources/org/drools/compiler/lang/DRL5Expressions.g:331:7: ( COMMA e2= expression )*
  					loop34:
  					while (true) {
  						int alt34=2;
  						int LA34_0 = input.LA(1);
  						if ( (LA34_0==COMMA) ) {
  							alt34=1;
  						}
  
  						switch (alt34) {
  						case 1 :
  							// src/main/resources/org/drools/compiler/lang/DRL5Expressions.g:331:8: COMMA e2= expression
  							{
  							match(input,COMMA,FOLLOW_COMMA_in_inExpression1600); if (state.failed) return result;
  							pushFollow(FOLLOW_expression_in_inExpression1604);
  							e2=expression();
  							state._fsp--;
  							if (state.failed) return result;
  							if ( state.backtracking==0 ) {   RelationalExprDescr rel = new RelationalExprDescr( "!=", false, null, leftDescr, (e2!=null?((DRL5Expressions.expression_return)e2).result:null) );
  							            descr.addOrMerge( rel );
  							        }
  							}
  							break;
  
  						default :
  							break loop34;
  						}
  					}
  
  					match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_inExpression1625); if (state.failed) return result;
  					if ( state.backtracking==0 ) { helper.emit( Location.LOCATION_LHS_INSIDE_CONDITION_END ); }
  					}
  					break;
  				case 2 :
  					// src/main/resources/org/drools/compiler/lang/DRL5Expressions.g:337:7: in= in_key LEFT_PAREN e1= expression ( COMMA e2= expression )* RIGHT_PAREN
  					{
  					pushFollow(FOLLOW_in_key_in_inExpression1641);
  					in_key();
  					state._fsp--;
  					if (state.failed) return result;
  					match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_inExpression1643); if (state.failed) return result;
  					if ( state.backtracking==0 ) {   helper.emit( Location.LOCATION_LHS_INSIDE_CONDITION_ARGUMENT ); }
  					pushFollow(FOLLOW_expression_in_inExpression1665);
  					e1=expression();
  					state._fsp--;
  					if (state.failed) return result;
  					if ( state.backtracking==0 ) {   descr = ConstraintConnectiveDescr.newOr();
  					            RelationalExprDescr rel = new RelationalExprDescr( "==", false, null, leftDescr, (e1!=null?((DRL5Expressions.expression_return)e1).result:null) );
  					            descr.addOrMerge( rel );
  					            result = descr;
  					        }
  					// src/main/resources/org/drools/compiler/lang/DRL5Expressions.g:345:7: ( COMMA e2= expression )*
  					loop35:
  					while (true) {
  						int alt35=2;
  						int LA35_0 = input.LA(1);
  						if ( (LA35_0==COMMA) ) {
  							alt35=1;
  						}
  
  						switch (alt35) {
  						case 1 :
  							// src/main/resources/org/drools/compiler/lang/DRL5Expressions.g:345:8: COMMA e2= expression
  							{
  							match(input,COMMA,FOLLOW_COMMA_in_inExpression1684); if (state.failed) return result;
  							pushFollow(FOLLOW_expression_in_inExpression1688);
  							e2=expression();
  							state._fsp--;
  							if (state.failed) return result;
  							if ( state.backtracking==0 ) {   RelationalExprDescr rel = new RelationalExprDescr( "==", false, null, leftDescr, (e2!=null?((DRL5Expressions.expression_return)e2).result:null) );
  							            descr.addOrMerge( rel );
  							        }
  							}
  							break;
  
  						default :
  							break loop35;
  						}
  					}
  
  					match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_inExpression1709); if (state.failed) return result;
  					if ( state.backtracking==0 ) { helper.emit( Location.LOCATION_LHS_INSIDE_CONDITION_END ); }
  					}
  					break;
  
  			}
  
  			}
  
  			if ( state.backtracking==0 ) { if( binding != null && descr != null ) descr.addOrMerge( binding ); }
  		}
  
  		catch (RecognitionException re) {
  		    throw re;
  		}
  
  		finally {
  			// do for sure before leaving
  		}
  		return result;
  	}