From 5383a8b913e74ebe5faa39ef3e570afb95779141 Mon Sep 17 00:00:00 2001 From: Nick Bowler Date: Wed, 19 Jul 2023 20:40:32 -0400 Subject: [PATCH] libcdecl: Factor out open-coded identifier patchup. There are two parser rules which handle english declarations of the form "identifier as type", these have to traverse the type name to replace the "null" declarator with the identifier. Instead of duplicating the code for this traversal, let's use a helper function to do it. --- src/parse.y | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/src/parse.y b/src/parse.y index cf24b25..0156bb3 100644 --- a/src/parse.y +++ b/src/parse.y @@ -155,6 +155,23 @@ static void join_specs(struct cdecl_declspec *a, struct cdecl_declspec *b) a = a->next; a->next = b; } + +/* + * Alter an abstract declarator (type name) to declare an identifier instead, + * used by the English parser rules to reduce "identifier as type" sequences. + */ +static struct cdecl *insert_identifier(struct cdecl *decl, char *ident) +{ + struct cdecl_declarator *d = decl->declarators; + + while (d->child) + d = d->child; + + d->type = CDECL_DECL_IDENT; + d->u.ident = ident; + + return decl; +} %} %destructor { free($$); } @@ -450,13 +467,7 @@ direct_declarator: { } english: T_DECLARE T_IDENT T_AS english_declaration { - $$ = $4; - for (struct cdecl_declarator *d = $$->declarators; d; d = d->child) { - if (d->type == CDECL_DECL_NULL) { - d->type = CDECL_DECL_IDENT; - d->u.ident = $2; - } - } + $$ = insert_identifier($4, $2); } | T_TYPE english_declaration { $$ = $2; } @@ -563,13 +574,7 @@ english_parameter: english_declaration | typedef_name_qual null_decl { .specifiers = $1, .declarators = $2); } | T_IDENT T_AS english_declaration { - $$ = $3; - for (struct cdecl_declarator *d = $$->declarators; d; d = d->child) { - if (d->type == CDECL_DECL_NULL) { - d->type = CDECL_DECL_IDENT; - d->u.ident = $1; - } - } + $$ = insert_identifier($3, $1); } english_array: T_VLA T_ARRAY english_vla T_OF { -- 2.43.2