From 1241880dd8385bd10d81bf3560397ae6ed728ae3 Mon Sep 17 00:00:00 2001 From: Andrea Shepard <andrea@persephoneslair.org> Date: Thu, 18 May 2017 20:02:59 +0000 Subject: [PATCH] Make LL(k) backend understand names/descriptions --- src/backends/llk.c | 72 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 71 insertions(+), 1 deletion(-) diff --git a/src/backends/llk.c b/src/backends/llk.c index 4bfb4f0f..62d33561 100644 --- a/src/backends/llk.c +++ b/src/backends/llk.c @@ -606,6 +606,70 @@ HParseResult *h_llk_parse_finish(HSuspendedParser *s) return llk_parse_finish_(s->mm__, s->backend_state); } +char * h_llk_get_description(HAllocator *mm__, + HParserBackend be, void *param) { + const char *format_str = "LL(%zu) parser backend"; + const char *generic_descr_format_str = + "LL(k) parser backend (default k is %zu)"; + uintptr_t params_int; + size_t k, len; + char *descr = NULL; + + params_int = (uintptr_t)param; + if (params_int > 0) { + /* A specific k was given */ + k = (size_t)params_int; + /* Measure how big a buffer we need */ + len = snprintf(NULL, 0, format_str, k); + /* Allocate it and do the real snprintf */ + descr = h_new(char, len + 1); + if (descr) { + snprintf(descr, len + 1, format_str, k); + } + } else { + /* + * No specific k, would use DEFAULT_KMAX. We say what DEFAULT_KMAX + * was compiled in in the description. + */ + len = snprintf(NULL, 0, generic_descr_format_str, DEFAULT_KMAX); + /* Allocate and do the real snprintf */ + descr = h_new(char, len + 1); + if (descr) { + snprintf(descr, len + 1, generic_descr_format_str, DEFAULT_KMAX); + } + } + + return descr; +} + +char * h_llk_get_short_name(HAllocator *mm__, + HParserBackend be, void *param) { + const char *format_str = "LL(%zu)", *generic_name = "LL(k)"; + uintptr_t params_int; + size_t k, len; + char *name = NULL; + + params_int = (uintptr_t)param; + if (params_int > 0) { + /* A specific k was given */ + k = (size_t)params_int; + /* Measure how big a buffer we need */ + len = snprintf(NULL, 0, format_str, k); + /* Allocate it and do the real snprintf */ + name = h_new(char, len + 1); + if (name) { + snprintf(name, len + 1, format_str, k); + } + } else { + /* No specific k, would use DEFAULT_KMAX */ + len = strlen(generic_name); + name = h_new(char, len + 1); + strncpy(name, generic_name, len + 1); + } + + return name; +} + HParserBackendVTable h__llk_backend_vtable = { .compile = h_llk_compile, @@ -616,8 +680,14 @@ HParserBackendVTable h__llk_backend_vtable = { .parse_chunk = h_llk_parse_chunk, .parse_finish = h_llk_parse_finish, - .copy_params = h_copy_numeric_param + .copy_params = h_copy_numeric_param, /* No free_param needed, since it's not actually allocated */ + + /* Name/param resolution functions */ + .backend_short_name = "llk", + .backend_description = "LL(k) parser backend", + .get_description_with_params = h_llk_get_description, + .get_short_name_with_params = h_llk_get_short_name }; -- GitLab