docs: private void lhsPattern( PatternDescrBuilder< ? > pattern,
                               String label,
                               boolean isUnification ) throws RecognitionException {
          boolean query = false;
          if ( input.LA( 1 ) == DRL5Lexer.QUESTION ) {
              match( input,
                     DRL5Lexer.QUESTION,
                     null,
                     null,
                     DroolsEditorType.SYMBOL );
              if ( state.failed ) return;
              query = true;
          }
  
          String type = this.qualifiedIdentifier();
          if ( state.failed ) return;
  
          if ( state.backtracking == 0 ) {
              pattern.type( type );
              pattern.isQuery( query );
              if ( label != null ) {
                  pattern.id( label,
                              isUnification );
              }
          }
  
          match( input,
                 DRL5Lexer.LEFT_PAREN,
                 null,
                 null,
                 DroolsEditorType.SYMBOL );
          if ( state.failed ) return;
  
          if ( input.LA( 1 ) != DRL5Lexer.RIGHT_PAREN && speculatePositionalConstraints() ) {
              positionalConstraints( pattern );
          }
  
          if ( input.LA( 1 ) != DRL5Lexer.RIGHT_PAREN ) {
              constraints( pattern );
          }
  
          match( input,
                 DRL5Lexer.RIGHT_PAREN,
                 null,
                 null,
                 DroolsEditorType.SYMBOL );
          if ( state.failed ) return;
  
          while ( input.LA( 1 ) == DRL5Lexer.AT ) {
              // annotation*
              annotation( pattern );
              if ( state.failed ) return;
          }
  
          if ( helper.validateIdentifierKey( DroolsSoftKeywords.OVER ) ) {
              //           || input.LA( 1 ) == DRL5Lexer.PIPE ) {
              patternFilter( pattern );
          }
  
          if ( helper.validateIdentifierKey( DroolsSoftKeywords.FROM ) ) {
              patternSource( pattern );
          }
  
          if ( state.backtracking == 0 ) {
              helper.emit( Location.LOCATION_LHS_BEGIN_OF_CONDITION );
          }
      }