diff --git a/src/hammer.c b/src/hammer.c
index ba4928e62099bb47a29804287040b7bebb3c0c6d..78279bab8d602ec7dd2f1dd5899ea1e72a0a9750 100644
--- a/src/hammer.c
+++ b/src/hammer.c
@@ -295,6 +295,29 @@ static char * h_get_backend_text_with_no_params(HAllocator *mm__,
   return text;
 }
 
+/* Query a backend by short name; return PB_INVALID if no match */
+
+HParserBackend h_query_backend_by_name(const char *name) {
+  HParserBackend result = PB_INVALID, i;
+
+  if (name != NULL) {
+    /* Okay, iterate over the backends PB_MIN <= i <= PB_MAX and check */
+    i = PB_MIN;
+    do {
+      if (i != PB_INVALID) {
+        if (backends[i]->backend_short_name != NULL) {
+          if (strcmp(name, backends[i]->backend_short_name) == 0) {
+            result = i;
+          }
+        }
+      }
+      ++i;
+    } while (i <= PB_MAX && result == PB_INVALID);
+  }
+
+  return result;
+}
+
 char * h_get_description_with_no_params(HAllocator *mm__,
                                         HParserBackend be, void *params) {
   return h_get_backend_text_with_no_params(mm__, be, 1);
diff --git a/src/hammer.h b/src/hammer.h
index 687592943102c30bd9794a00f20784a5017b9bb1..2efa75b5d2e097982bc88b8fe41f66711db62cbf 100644
--- a/src/hammer.h
+++ b/src/hammer.h
@@ -340,6 +340,13 @@ const char * h_get_descriptive_text_for_backend(HParserBackend be);
 HAMMER_FN_DECL(char *, h_get_descriptive_text_for_backend_with_params,
                HParserBackendWithParams *be_with_params);
 
+/**
+ * Look up an HParserBackend by name; this should round-trip with
+ * h_get_name_for_backend().
+ */
+
+HParserBackend h_query_backend_by_name(const char *name);
+
 /**
  * Top-level function to call a parser that has been built over some
  * piece of input (of known size).