diff --git a/src/backends/glr.c b/src/backends/glr.c
index 5619b26a4558b7ffbfe5b0ac33689e4625848cc2..878bbc9a0382773b9933213b58451c092588ca12 100644
--- a/src/backends/glr.c
+++ b/src/backends/glr.c
@@ -305,6 +305,7 @@ char * h_glr_get_short_name(HAllocator *mm__,
   return name;
 }
 
+/*TODO: better handling of errors?*/
 int h_glr_extract_params(void ** params, char* raw_params) {
 
 	*params = NULL;
@@ -313,7 +314,7 @@ int h_glr_extract_params(void ** params, char* raw_params) {
     int success = 0;
     uintptr_t param;
 
-    success = sscanf(raw_params + 1, "%d", &param_0);
+    success = sscanf(raw_params, "%d", &param_0);
 
     if(success) {
     	param = (uintptr_t) param_0;
diff --git a/src/backends/lalr.c b/src/backends/lalr.c
index cdf721000d721d8354d3dc41e7788f31bc26dfe2..a133ec1db5d3a2ed65c33958d1cf1449b8d426f3 100644
--- a/src/backends/lalr.c
+++ b/src/backends/lalr.c
@@ -436,6 +436,7 @@ char * h_lalr_get_short_name(HAllocator *mm__,
   return name;
 }
 
+/*TODO better error handling*/
 int h_lalr_extract_params(void ** params, char* raw_params) {
 
 	*params = NULL;
@@ -444,7 +445,7 @@ int h_lalr_extract_params(void ** params, char* raw_params) {
     int success = 0;
     uintptr_t param;
 
-    success = sscanf(raw_params + 1, "%d", &param_0);
+    success = sscanf(raw_params, "%d", &param_0);
 
     if(success) {
     	param = (uintptr_t) param_0;
diff --git a/src/backends/llk.c b/src/backends/llk.c
index b06f431975f7dbc7793343d2eb1f58190cfcf345..1a210c0f1990c05782e2c4e71bdbdea55d410f78 100644
--- a/src/backends/llk.c
+++ b/src/backends/llk.c
@@ -670,6 +670,7 @@ char * h_llk_get_short_name(HAllocator *mm__,
   return name;
 }
 
+/*TODO better error handling*/
 int h_llk_extract_params(void ** params, char * raw_params) {
 
 	*params = NULL;
@@ -678,7 +679,7 @@ int h_llk_extract_params(void ** params, char * raw_params) {
     int success = 0;
     uintptr_t param;
 
-    success = sscanf(raw_params + 1, "%d", &param_0);
+    success = sscanf(raw_params, "%d", &param_0);
 
     if(success) {
     	param = (uintptr_t) param_0;
diff --git a/src/hammer.c b/src/hammer.c
index 640481976c00107e189acbd75678abf3096feedb..2bdc0d1d2e3789febb992b9d241ba2bf4df087fb 100644
--- a/src/hammer.c
+++ b/src/hammer.c
@@ -329,12 +329,26 @@ char * h_get_short_name_with_no_params(HAllocator *mm__,
   return h_get_backend_text_with_no_params(mm__, be, 0);
 }
 
+char* get_params_as_string(char *remainder, char *end_paren,
+		char *params_as_string, HAllocator *mm__) {
+	char *after_open_paren = remainder + 1;
+	size_t params_len = strlen(after_open_paren) - strlen(end_paren);
+	if(params_len > 0) {
+		params_as_string = h_new(char, params_len + 1);
+		memset(params_as_string, '\0', params_len + 1);
+		strncpy(params_as_string, after_open_paren, params_len);
+	}
+	return params_as_string;
+}
+
 HParserBackendWithParams * h_get_backend_with_params_by_name(const char *name_with_params) {
 	HAllocator *mm__ = &system_allocator;
 	HParserBackendWithParams *result = NULL;
 	HParserBackend be;
 	char *name_with_no_params = NULL;
+	char *remainder = NULL;
 	char *params_as_string = NULL;
+	char *end_paren = NULL;
 	size_t name_len, len;
 
 	if(name_with_params != NULL) {
@@ -343,10 +357,16 @@ HParserBackendWithParams * h_get_backend_with_params_by_name(const char *name_wi
 
 		if (result) {
 			len = strlen(name_with_params);
-			params_as_string = strstr(name_with_params, "(");
+			remainder = strstr(name_with_params, "(");
+
+			if(remainder != NULL) {
+				name_len = len - strlen(remainder);
+				end_paren = strrchr(params_as_string, ')');
+				if(end_paren != NULL && end_paren != remainder +1) {
+					params_as_string = get_params_as_string(
+							remainder, end_paren, params_as_string, mm__);
+				} /* else error */
 
-			if(params_as_string) {
-				name_len = len - strlen(params_as_string);
 			} else {
 				name_len = len;
 			}
diff --git a/src/hammer.h b/src/hammer.h
index 0a66510b3feb7ed0aa51f6800ac38a53865a83f4..1e866989076d99e77ca9985bf0288e3cfb6f6285 100644
--- a/src/hammer.h
+++ b/src/hammer.h
@@ -54,6 +54,7 @@ typedef enum HParserBackend_ {
   PB_MAX = PB_GLR
 } HParserBackend;
 
+/*TODO double check which of my additions are needed for this change (as opposed to for the dlopen change)*/
 typedef struct HParserBackendWithParams_ {
   /* Name of backend (if called via string, need to keep this for loading backends from modules)  */
   const char *name;