Index: trunk/src/org/openstreetmap/josm/data/osm/search/SearchCompiler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/search/SearchCompiler.java	(revision 18194)
+++ trunk/src/org/openstreetmap/josm/data/osm/search/SearchCompiler.java	(revision 18195)
@@ -291,4 +291,14 @@
             return match(object);
         }
+
+        /**
+         * Check if this is a valid match object
+         * @return {@code this}, for easy chaining
+         * @throws SearchParseError If the match is not valid
+         */
+        public Match validate() throws SearchParseError {
+            // Default to no-op
+            return this;
+        }
     }
 
@@ -861,4 +871,20 @@
                 return false;
             return true;
+        }
+
+        @Override
+        public Match validate() throws SearchParseError {
+            if (this.referenceValue == null) {
+                final String referenceType;
+                if (this.compareMode == +1) {
+                    referenceType = ">";
+                } else if (this.compareMode == -1) {
+                    referenceType = "<";
+                } else {
+                    referenceType = "<unknown>";
+                }
+                throw new SearchParseError(tr("Reference value for ''{0}'' expected", referenceType));
+            }
+            return this;
         }
     }
@@ -2109,11 +2135,11 @@
             String key = tokenizer.getText();
             if (tokenizer.readIfEqual(Token.EQUALS)) {
-                return new ExactKeyValue(regexSearch, caseSensitive, key, tokenizer.readTextOrNumber());
+                return new ExactKeyValue(regexSearch, caseSensitive, key, tokenizer.readTextOrNumber()).validate();
             } else if (tokenizer.readIfEqual(Token.TILDE)) {
-                return new ExactKeyValue(true, caseSensitive, key, tokenizer.readTextOrNumber());
+                return new ExactKeyValue(true, caseSensitive, key, tokenizer.readTextOrNumber()).validate();
             } else if (tokenizer.readIfEqual(Token.LESS_THAN)) {
-                return new ValueComparison(key, tokenizer.readTextOrNumber(), -1);
+                return new ValueComparison(key, tokenizer.readTextOrNumber(), -1).validate();
             } else if (tokenizer.readIfEqual(Token.GREATER_THAN)) {
-                return new ValueComparison(key, tokenizer.readTextOrNumber(), +1);
+                return new ValueComparison(key, tokenizer.readTextOrNumber(), +1).validate();
             } else if (tokenizer.readIfEqual(Token.COLON)) {
                 // see if we have a Match that takes a data parameter
@@ -2124,9 +2150,9 @@
                 UnaryMatchFactory unaryFactory = unaryMatchFactoryMap.get(key);
                 if (unaryFactory != null)
-                    return unaryFactory.get(key, parseFactor(), tokenizer);
+                    return unaryFactory.get(key, parseFactor(), tokenizer).validate();
 
                 // key:value form where value is a string (may be OSM key search)
                 final String value = tokenizer.readTextOrNumber();
-                return new KeyValue(key, value != null ? value : "", regexSearch, caseSensitive);
+                return new KeyValue(key, value != null ? value : "", regexSearch, caseSensitive).validate();
             } else if (tokenizer.readIfEqual(Token.QUESTION_MARK))
                 return new BooleanMatch(key, false);
@@ -2134,12 +2160,12 @@
                 SimpleMatchFactory factory = simpleMatchFactoryMap.get(key);
                 if (factory != null)
-                    return factory.get(key, caseSensitive, regexSearch, null);
+                    return factory.get(key, caseSensitive, regexSearch, null).validate();
 
                 UnaryMatchFactory unaryFactory = unaryMatchFactoryMap.get(key);
                 if (unaryFactory != null)
-                    return unaryFactory.get(key, parseFactor(), null);
+                    return unaryFactory.get(key, parseFactor(), null).validate();
 
                 // match string in any key or value
-                return new Any(key, regexSearch, caseSensitive);
+                return new Any(key, regexSearch, caseSensitive).validate();
             }
         } else
