docs: private BaseDescr lhsUnary( final CEDescrBuilder< ? , ? > ce,
                                  boolean allowOr ) throws RecognitionException {
          BaseDescr result = null;
          if ( helper.validateIdentifierKey( DroolsSoftKeywords.EXISTS ) ) {
              result = lhsExists( ce,
                                  allowOr );
              if ( helper.validateIdentifierKey( DroolsSoftKeywords.DO ) ) {
                  namedConsequence( ce, null );
              }
          } else if ( helper.validateIdentifierKey( DroolsSoftKeywords.NOT ) ) {
              result = lhsNot( ce,
                               allowOr );
              if ( helper.validateIdentifierKey( DroolsSoftKeywords.DO ) ) {
                  namedConsequence( ce, null );
              }
          } else if ( helper.validateIdentifierKey( DroolsSoftKeywords.EVAL ) ) {
              result = lhsEval( ce );
              for (BaseDescr i = consequenceInvocation( ce ); i != null; i = consequenceInvocation( ce ));
          } else if ( helper.validateIdentifierKey( DroolsSoftKeywords.FORALL ) ) {
              result = lhsForall( ce );
          } else if ( helper.validateIdentifierKey( DroolsSoftKeywords.ACCUMULATE ) ) {
              result = lhsAccumulate( ce );
          } else if ( input.LA( 1 ) == DRL5Lexer.LEFT_PAREN ) {
              // the order here is very important: this if branch must come before the lhsPatternBind below
              result = lhsParen( ce,
                                 allowOr );
              if ( helper.validateIdentifierKey( DroolsSoftKeywords.DO ) ) {
                  namedConsequence( ce, null );
              }
          } else if ( input.LA( 1 ) == DRL5Lexer.ID || input.LA( 1 ) == DRL5Lexer.QUESTION ) {
              result = lhsPatternBind( ce,
                                       allowOr );
              for (BaseDescr i = consequenceInvocation( ce ); i != null; i = consequenceInvocation( ce ));
          } else {
              failMismatchedTokenException();
          }
          if ( input.LA( 1 ) == DRL5Lexer.SEMICOLON ) {
              match( input,
                     DRL5Lexer.SEMICOLON,
                     null,
                     null,
                     DroolsEditorType.SYMBOL );
              if ( state.failed ) return null;
          }
  
          return result;
      }