From f40d2e7240119284f658e028a1d726a20ec246fe Mon Sep 17 00:00:00 2001 From: Andrea Shepard <andrea@persephoneslair.org> Date: Sun, 7 May 2017 22:54:52 +0000 Subject: [PATCH] Add numeric param mechanism for LL/LALR/GLR backends --- src/backends/glr.c | 5 ++++- src/backends/lalr.c | 4 +++- src/backends/llk.c | 5 ++++- src/hammer.c | 15 +++++++++++++++ src/internal.h | 4 ++++ 5 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/backends/glr.c b/src/backends/glr.c index 535dc286..a88090a3 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 b82ef71c..b60c8d58 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 4e8209b3..4bfb4f0f 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 c72c59fb..dba530e6 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 22407cca..1ed77e7a 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); -- GitLab