docs: public final EObject ruleExpression() throws RecognitionException {
          EObject current = null;
  
          Token otherlv_2=null;
          EObject this_AndExpression_0 = null;
  
          EObject lv_right_3_0 = null;
  
  
           enterRule(); 
              
          try {
              // InternalSimpleExpressions.g:149:28: ( (this_AndExpression_0= ruleAndExpression ( () otherlv_2= '||' ( (lv_right_3_0= ruleAndExpression ) ) )* ) )
              // InternalSimpleExpressions.g:150:1: (this_AndExpression_0= ruleAndExpression ( () otherlv_2= '||' ( (lv_right_3_0= ruleAndExpression ) ) )* )
              {
              // InternalSimpleExpressions.g:150:1: (this_AndExpression_0= ruleAndExpression ( () otherlv_2= '||' ( (lv_right_3_0= ruleAndExpression ) ) )* )
              // InternalSimpleExpressions.g:151:5: this_AndExpression_0= ruleAndExpression ( () otherlv_2= '||' ( (lv_right_3_0= ruleAndExpression ) ) )*
              {
               
                      newCompositeNode(grammarAccess.getExpressionAccess().getAndExpressionParserRuleCall_0()); 
                  
              pushFollow(FOLLOW_8);
              this_AndExpression_0=ruleAndExpression();
  
              state._fsp--;
  
               
                      current = this_AndExpression_0; 
                      afterParserOrEnumRuleCall();
                  
              // InternalSimpleExpressions.g:159:1: ( () otherlv_2= '||' ( (lv_right_3_0= ruleAndExpression ) ) )*
              loop2:
              do {
                  int alt2=2;
                  int LA2_0 = input.LA(1);
  
                  if ( (LA2_0==16) ) {
                      alt2=1;
                  }
  
  
                  switch (alt2) {
              	case 1 :
              	    // InternalSimpleExpressions.g:159:2: () otherlv_2= '||' ( (lv_right_3_0= ruleAndExpression ) )
              	    {
              	    // InternalSimpleExpressions.g:159:2: ()
              	    // InternalSimpleExpressions.g:160:5: 
              	    {
  
              	            current = forceCreateModelElementAndSet(
              	                grammarAccess.getExpressionAccess().getOrExpressionLeftAction_1_0(),
              	                current);
              	        
  
              	    }
  
              	    otherlv_2=(Token)match(input,16,FOLLOW_5); 
  
              	        	newLeafNode(otherlv_2, grammarAccess.getExpressionAccess().getVerticalLineVerticalLineKeyword_1_1());
              	        
              	    // InternalSimpleExpressions.g:169:1: ( (lv_right_3_0= ruleAndExpression ) )
              	    // InternalSimpleExpressions.g:170:1: (lv_right_3_0= ruleAndExpression )
              	    {
              	    // InternalSimpleExpressions.g:170:1: (lv_right_3_0= ruleAndExpression )
              	    // InternalSimpleExpressions.g:171:3: lv_right_3_0= ruleAndExpression
              	    {
              	     
              	    	        newCompositeNode(grammarAccess.getExpressionAccess().getRightAndExpressionParserRuleCall_1_2_0()); 
              	    	    
              	    pushFollow(FOLLOW_8);
              	    lv_right_3_0=ruleAndExpression();
  
              	    state._fsp--;
  
  
              	    	        if (current==null) {
              	    	            current = createModelElementForParent(grammarAccess.getExpressionRule());
              	    	        }
              	           		set(
              	           			current, 
              	           			"right",
              	            		lv_right_3_0, 
              	            		"org.eclipse.xtext.xtext.generator.parser.antlr.splitting.SimpleExpressions.AndExpression");
              	    	        afterParserOrEnumRuleCall();
              	    	    
  
              	    }
  
  
              	    }
  
  
              	    }
              	    break;
  
              	default :
              	    break loop2;
                  }
              } while (true);
  
  
              }
  
  
              }
  
               leaveRule(); 
          }
           
              catch (RecognitionException re) { 
                  recover(input,re); 
                  appendSkippedTokens();
              } 
          finally {
          }
          return current;
      }