]> git.draconx.ca Git - cdecl99.git/commitdiff
libcdecl: Factor out open-coded identifier patchup.
authorNick Bowler <nbowler@draconx.ca>
Thu, 20 Jul 2023 00:40:32 +0000 (20:40 -0400)
committerNick Bowler <nbowler@draconx.ca>
Thu, 20 Jul 2023 00:40:32 +0000 (20:40 -0400)
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

index cf24b25ae73d1e3377bc8804b492bb10d118f817..0156bb3642108ef9f708ecf0e622f0d80361f8fb 100644 (file)
@@ -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($$); }            <strval>
@@ -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 {