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.
a = a->next;
a->next = 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>
%}
%destructor { free($$); } <strval>
}
english: T_DECLARE T_IDENT T_AS english_declaration {
}
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;
}
} | T_TYPE english_declaration {
$$ = $2;
}
.specifiers = $1,
.declarators = $2);
} | T_IDENT T_AS english_declaration {
.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 {
}
english_array: T_VLA T_ARRAY english_vla T_OF {