diff --git a/src/backends/glr.c b/src/backends/glr.c
index 535dc2860c59018324893da1450cfc4ff4fadf8b..a88090a38e891dcc85926849e4fc59ddf7c67be2 100644
--- a/src/backends/glr.c
+++ b/src/backends/glr.c
@@ -244,7 +244,10 @@ HParseResult *h_glr_parse(HAllocator* mm__, const HParser* parser, HInputStream*
 HParserBackendVTable h__glr_backend_vtable = {
   .compile = h_glr_compile,
   .parse = h_glr_parse,
-  .free = h_glr_free
+  .free = h_glr_free,
+
+  .copy_params = h_copy_numeric_param
+  /* No free_param needed, since it's not actually allocated */
 };
 
 
diff --git a/src/backends/lalr.c b/src/backends/lalr.c
index b82ef71c477128728db39d4ac72ef8d4ab0dc56c..b60c8d586e75d1801938314f61a9c4fe6d008af8 100644
--- a/src/backends/lalr.c
+++ b/src/backends/lalr.c
@@ -368,7 +368,9 @@ HParserBackendVTable h__lalr_backend_vtable = {
   .free = h_lalr_free,
   .parse_start = h_lr_parse_start,
   .parse_chunk = h_lr_parse_chunk,
-  .parse_finish = h_lr_parse_finish
+  .parse_finish = h_lr_parse_finish,
+  .copy_params = h_copy_numeric_param
+  /* No free_param needed, since it's not actually allocated */
 };
 
 
diff --git a/src/backends/llk.c b/src/backends/llk.c
index 4e8209b30f4aa7bd97f5df1c49202643d4efedd4..4bfb4f0f483519a4e1258e26ffb812a7733de9b7 100644
--- a/src/backends/llk.c
+++ b/src/backends/llk.c
@@ -614,7 +614,10 @@ HParserBackendVTable h__llk_backend_vtable = {
 
   .parse_start = h_llk_parse_start,
   .parse_chunk = h_llk_parse_chunk,
-  .parse_finish = h_llk_parse_finish
+  .parse_finish = h_llk_parse_finish,
+
+  .copy_params = h_copy_numeric_param
+  /* No free_param needed, since it's not actually allocated */
 };
 
 
diff --git a/src/hammer.c b/src/hammer.c
index c72c59fb86473b7a232cd762cfe4b4362ac0559f..dba530e66762b5e6dfccdc42ea63fbc7ed1e7300 100644
--- a/src/hammer.c
+++ b/src/hammer.c
@@ -105,6 +105,21 @@ HParserBackendWithParams * h_copy_backend_with_params__m(HAllocator *mm__,
   return r;
 }
 
+/*
+ * copy_params for backends where the parameter is actually a number cast to
+ * void *, such as LLk, LALR and GLR.  Use NULL for free_params in this
+ * case.
+ */
+
+int h_copy_numeric_param(HAllocator *mm__, void **out, void *in) {
+  int rv = 0;
+
+  if (out) *out = in; 
+  else rv = -1; /* error return, nowhere to write result */
+
+  return rv; 
+}
+
 /* Free this HParserBackendWithParams, and free the params too */
 
 void h_free_backend_with_params(HParserBackendWithParams *be_with_params) {
diff --git a/src/internal.h b/src/internal.h
index 22407cca30a58e9a3ec177dce3a6cab7a4ef5be8..1ed77e7a021269d4d764af35c4af32a5aa9f2e6f 100644
--- a/src/internal.h
+++ b/src/internal.h
@@ -357,6 +357,10 @@ static inline HParserBackend h_get_default_backend__int(void) {
   return PB_PACKRAT;
 }
 
+/* copy_params for backends where the parameter is not actually a pointer */
+
+int h_copy_numeric_param(HAllocator *mm__, void **out, void *in);
+
 static inline
 HParser *h_new_parser(HAllocator *mm__, const HParserVtable *vt, void *env) {
   HParser *p = h_new(HParser, 1);